summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2012-02-09 16:37:00 +0100
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2012-02-09 16:37:00 +0100
commitfaa1cb9123d0686ea3f32b04c9a1e89fd3984e89 (patch)
tree05171e497415e8913e72ddb731a32c6b9d54a399
parent2849dc00038e6b18403ffae653c89ae0b835a14a (diff)
downloadlatrace-debug_firefox.tar.gz
latrace-debug_firefox.tar.xz
latrace-debug_firefox.zip
-rw-r--r--etc/latrace.d/latrace.conf.in4
-rw-r--r--src/Makefile3
-rw-r--r--src/audit-init.c8
-rw-r--r--src/audit.c11
-rw-r--r--src/malloc-hook.c74
5 files changed, 95 insertions, 5 deletions
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 <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;
+}