From 83ddd409a43aa1dc74a34b60cc10bd2afed896b6 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 14 Apr 2025 23:51:09 +0200 Subject: [PATCH] proj: Allow exclutions of functions --- proj/intercept/src/intercept.c | 16 +++++++++++++--- proj/server/src/test-interrupts | 1 + proj/server/src/test-return-values | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/proj/intercept/src/intercept.c b/proj/intercept/src/intercept.c index d666055..eb0e086 100644 --- a/proj/intercept/src/intercept.c +++ b/proj/intercept/src/intercept.c @@ -829,10 +829,20 @@ static void init(void) { for (int i = 0; func_names[i] != NULL; i++) { const char *name1 = func_names[i]; const int wildcard = name1[strlen(name1) - 1] == '*'; + int not = 0; + if (name1[0] == '-') { + name1++; + not = 1; + } for (int j = 0; j < sizeof(func_names_ordered) / sizeof(char *); j++) { const char *name2 = func_names_ordered[j]; - if (strcmp(name1, name2) == 0 || (wildcard && strncmp(name1, name2, strlen(name1) - 1) == 0)) - func_flags[j] |= 1; + if (strcmp(name1, name2) == 0 || (wildcard && strncmp(name1, name2, strlen(name1) - 1) == 0)) { + if (not) { + func_flags[j] &= ~1; + } else { + func_flags[j] |= 1; + } + } } } } else { @@ -1158,7 +1168,7 @@ int sym(sigaction)(int sig, const struct sigaction *restrict act, struct sigacti if (maskstr[0] != 0) strcat(maskstr, ","); strcat(maskstr, getsigstr(i)); } - msg("return %i; errno %s; oact={sa_flags: 0x%x:%s, %s: %p, sa-mask: [%s]}", ret, strerrorname_np(errno), oact->sa_flags, flgstr, name, ptr, maskstr); + msg("return %i; errno %s; oact={sa_flags: 0x%x:%s, %s: %p, sa_mask: [%s]}", ret, strerrorname_np(errno), oact->sa_flags, flgstr, name, ptr, maskstr); } else { msg("return %i; errno %s", ret, strerrorname_np(errno)); } diff --git a/proj/server/src/test-interrupts b/proj/server/src/test-interrupts index a5ab202..c005edc 100755 --- a/proj/server/src/test-interrupts +++ b/proj/server/src/test-interrupts @@ -24,6 +24,7 @@ def main() -> None: subprocess.run(extra, env={ 'LD_PRELOAD': os.getcwd() + '/../../intercept/intercept.so', 'INTERCEPT': 'unix:' + socket_name, + 'INTERCEPT_FUNCTIONS': ','.join(['*', '-malloc', '-calloc', '-realloc', '-reallocarray', '-free']), }) diff --git a/proj/server/src/test-return-values b/proj/server/src/test-return-values index df2bcc0..b59a3c6 100755 --- a/proj/server/src/test-return-values +++ b/proj/server/src/test-return-values @@ -35,6 +35,7 @@ def main() -> None: subprocess.run(extra, stdin=stdin, env={ 'LD_PRELOAD': os.getcwd() + '/../../intercept/intercept.so', 'INTERCEPT': 'unix:' + socket_name, + 'INTERCEPT_FUNCTIONS': ','.join(['*', '-malloc', '-calloc', '-realloc', '-reallocarray', '-free']), }) for i, name in enumerate(ctx['call_sequence']): errors = [r[1] for r in ctx['results'] if r[0] == i]