summaryrefslogtreecommitdiffstats
path: root/src/malloc-hook.c
blob: b455b82483309167eb0cc949a99c95bd59bcadd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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;
}