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;
}
|