Skip to content

Instantly share code, notes, and snippets.

@drakenclimber
Last active February 5, 2020 23:15
Show Gist options
  • Save drakenclimber/934e7377498a53fb70dfc535ac84fb62 to your computer and use it in GitHub Desktop.
Save drakenclimber/934e7377498a53fb70dfc535ac84fb62 to your computer and use it in GitHub Desktop.
print libseccomp argument chains
#include <stdarg.h>
#include <stdio.h>
static void print_line(int indent_level, const char *format, ...)
{
int i;
for (i = 0; i < indent_level; i++)
fprintf(stdout, " ");
va_list(args);
va_start(args, format);
vfprintf(stdout, format, args);
va_end(args);
}
#define INDENT 2
static void print_chain(int indent_level, struct db_arg_chain_tree *chain)
{
print_line(indent_level, "----chain---- %p\n", chain);
print_line(indent_level + INDENT,
"arg = %d mask = 0x%x datum = 0x%x op = %d\n",
chain->arg, chain->mask, chain->datum, chain->op);
print_line(indent_level + INDENT,
"act_t_flg = %d act_f_flg = %d\n",
chain->act_t_flg, chain->act_f_flg);
print_line(indent_level + INDENT,
"act_t = 0x%08x act_f = 0x%08x\n",
chain->act_t, chain->act_f);
print_line(indent_level + INDENT,
"lvl_prv = %p lvl nxt = %p\n",
chain->lvl_prv, chain->lvl_nxt);
print_line(indent_level + INDENT,
"nxt_t = %p nxt_f = %p\n",
chain->nxt_t, chain->nxt_f);
}
static void print_chains(int indent_level,
const struct db_sys_list *sys,
struct db_arg_chain_tree *chain,
bool print_syscall_header)
{
if (chain == NULL)
return;
if (print_syscall_header)
print_line(indent_level, "----syscall %d----\n", sys->num);
print_chain(indent_level + INDENT, chain);
print_line(indent_level + 2 * INDENT, "----true chain----\n");
print_chains(indent_level + 2 * INDENT, sys, chain->nxt_t, false);
print_line(indent_level + 2 * INDENT, "----false chain----\n");
print_chains(indent_level + 2 * INDENT, sys, chain->nxt_f, false);
print_line(indent_level + 2 * INDENT, "----lvl nxt chain----\n");
print_chains(indent_level + 2 * INDENT, sys, chain->lvl_nxt, false);
}
/* example usage */
for (i = 0; i < col->filter_cnt; i++) {
syscall = col->filters[i]->syscalls;
fprintf(stderr, "filter[%d]\n", i);
while(syscall) {
print_chains(0, syscall, syscall->chains, true);
syscall = syscall->next;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment