From faa1cb9123d0686ea3f32b04c9a1e89fd3984e89 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Thu, 9 Feb 2012 16:37:00 +0100 Subject: changes --- etc/latrace.d/latrace.conf.in | 4 +-- src/Makefile | 3 +- src/audit-init.c | 8 ++++- src/audit.c | 11 ++++++- src/malloc-hook.c | 74 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 src/malloc-hook.c diff --git a/etc/latrace.d/latrace.conf.in b/etc/latrace.d/latrace.conf.in index 2788b00..203887c 100644 --- a/etc/latrace.d/latrace.conf.in +++ b/etc/latrace.d/latrace.conf.in @@ -16,7 +16,7 @@ OPTIONS { # -p, --pipe # use pipe to latrace process to send audit data # latrace app is then the one displaying the output - PIPE = YES + # PIPE = YES # -S, --timestamp # display timestamp for each symbol @@ -84,7 +84,7 @@ OPTIONS { # SYM = krava # -n, --sym-omit - # SYM_OMIT = krava + SYM_OMIT = __longjmp_chk, longjmp, __sigsetjmp, _setjmp # -b, --flow-below # SYM_BELOW = krava diff --git a/src/Makefile b/src/Makefile index 169a5f3..8699d11 100644 --- a/src/Makefile +++ b/src/Makefile @@ -30,7 +30,8 @@ AUDIT_OBJS=\ src/objsearch.o \ src/stack.o \ src/symbol.o \ - src/lib-include.o + src/lib-include.o \ + src/malloc-hook.o ifeq ($(CONFIG_ARCH_HAVE_ARGS),y) AUDIT_OBJS+=\ diff --git a/src/audit-init.c b/src/audit-init.c index f36fee3..7ecce17 100644 --- a/src/audit-init.c +++ b/src/audit-init.c @@ -79,7 +79,7 @@ static int read_config(char *dir) sprintf(file, "%s/config", dir); if (-1 == (fd = open(file, O_RDONLY))) { - perror("open failed"); + perror("open krava failed"); return -1; } @@ -257,6 +257,12 @@ int audit_init(int argc, char **argv, char **env) lt_sh(&cfg, global_symbols) = lt_sh(&cfg, args_enabled); PRINT_VERBOSE(&cfg, 1, "global_symbols %d\n", lt_sh(&cfg, global_symbols)); + { + static int krava = 0; + printf("krava %p\n", &krava); + while (!krava) {} + } + cfg.init_ok = 1; return 0; } diff --git a/src/audit.c b/src/audit.c index 97cbaf3..e942a58 100644 --- a/src/audit.c +++ b/src/audit.c @@ -41,6 +41,7 @@ static __thread int pipe_fd = 0; static __thread int flow_below_stack = 0; static __thread int indent_depth = 0; +int check_malloc_hook(void); static int check_names(char *name, char **ptr) { @@ -203,6 +204,12 @@ do { \ return ret; \ } while(0) +#define CHECK_MALLOC_HOOK() \ +do { \ + if (check_malloc_hook()) \ + return -1; \ +} while(0) + unsigned int la_version(unsigned int v) { return v; @@ -274,7 +281,7 @@ static unsigned int la_symbind(ElfW(Sym) *sym, const char *symname) void la_activity(uintptr_t *cookie, unsigned int act) { - PRINT_VERBOSE(&cfg, 2, "%s\n", "entry"); +// PRINT_VERBOSE(&cfg, 2, "%s\n", "entry"); } char* la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag) @@ -323,6 +330,8 @@ pltenter(ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook, do { CHECK_DISABLED(sym->st_value); + CHECK_MALLOC_HOOK(); + CHECK_PID(sym->st_value); sym_entry(symname, (void*) sym->st_value, diff --git a/src/malloc-hook.c b/src/malloc-hook.c new file mode 100644 index 0000000..b455b82 --- /dev/null +++ b/src/malloc-hook.c @@ -0,0 +1,74 @@ + +#include + +static __thread int in_hook = 0; + +extern void (*__free_hook)(void *ptr); +extern void *(*__malloc_hook)(size_t size); +extern void *(*__realloc_hook)(void *ptr, size_t size); +extern void *(*__memalign_hook)(size_t alignment, size_t size); + +void (*hook_free_saved)(void *ptr); +void *(*hook_malloc_saved)(size_t size); +void *(*hook_realloc_saved)(void *ptr, size_t size); +void *(*hook_memalign_saved)(size_t alignment, size_t size); + +static int hooked_free; +static int hooked_malloc; +static int hooked_realloc; +static int hooked_memalign; + +static void hook_free(void *ptr) +{ + in_hook = 1; + hook_free_saved(ptr); + in_hook = 0; +} + +static void *hook_malloc(size_t size) +{ + void *p; + + in_hook = 1; + p = hook_malloc_saved(size); + in_hook = 0; + return p; +} + +static void *hook_realloc(void *ptr, size_t size) +{ + void *p; + + in_hook = 1; + p = hook_realloc_saved(ptr, size); + in_hook = 0; + return p; +} + +static void *hook_memalign(size_t alignment, size_t size) +{ + void *p; + + in_hook = 1; + p = hook_memalign_saved(alignment, size); + in_hook = 0; + return p; +} + +#define HOOK(name) \ +do { \ + if (!hooked_##name && __##name##_hook) { \ + hook_##name##_saved = __##name##_hook; \ + __##name##_hook = hook_##name; \ + hooked_##name = 1; \ + } \ +} while(0) + +int check_malloc_hook(void) +{ + HOOK(free); + HOOK(malloc); + HOOK(realloc); + HOOK(memalign); + return in_hook ? -1 : 0; +} -- cgit