diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 3 | ||||
| -rw-r--r-- | src/audit-init.c | 8 | ||||
| -rw-r--r-- | src/audit.c | 11 | ||||
| -rw-r--r-- | src/malloc-hook.c | 74 |
4 files changed, 93 insertions, 3 deletions
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 <stdlib.h> + +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; +} |
