From: lace <> Date: Sun, 1 Jun 2008 08:13:43 +0000 (+0000) Subject: glibc malloc() mangler. X-Git-Url: http://git.jankratochvil.net/?p=nethome.git;a=commitdiff_plain;h=6694e46ce2a90eaec122fec1fc755fc2d7493175;hp=2e1506d8e589032e8514ace616eca12574b85753 glibc malloc() mangler. --- diff --git a/src/glibcmangle.c b/src/glibcmangle.c new file mode 100644 index 0000000..e1f1c1a --- /dev/null +++ b/src/glibcmangle.c @@ -0,0 +1,109 @@ +/* Prototypes for __malloc_hook, __free_hook, __realloc_hook */ +#include +#include + +/* Prototypes for our hooks. */ +static void my_init_hook (void); +static void *my_malloc_hook (size_t, const void *); +static void my_free_hook (void *, const void *); +static void *my_realloc_hook (void *, size_t, const void *); + +/* Override initializing hook from the C library. */ +void (*__malloc_initialize_hook) (void) = my_init_hook; + +static void (*old_free_hook) __MALLOC_PMT ((void *__ptr, + __const __malloc_ptr_t)); +static void *(*old_malloc_hook) __MALLOC_PMT ((size_t __size, + __const __malloc_ptr_t)); +static void *(*old_realloc_hook) __MALLOC_PMT ((void *__ptr, size_t __size, + __const __malloc_ptr_t)); + +static void +my_init_hook (void) +{ + old_malloc_hook = __malloc_hook; + old_free_hook = __free_hook; + old_realloc_hook = __realloc_hook; + __malloc_hook = my_malloc_hook; + __free_hook = my_free_hook; + __realloc_hook = my_realloc_hook; +} + +static void * +my_malloc_hook (size_t size, const void *caller) +{ + void *result; + /* Restore all old hooks */ + __malloc_hook = old_malloc_hook; + __free_hook = old_free_hook; + __realloc_hook = old_realloc_hook; + /* Call recursively */ + result = malloc (sizeof (size_t) + size); + if (result != NULL) + { + *(size_t *) result = size; + result += sizeof (size_t); + memset (result, 0xF3, size); + } + /* Restore our own hooks */ + __malloc_hook = my_malloc_hook; + __free_hook = my_free_hook; + __realloc_hook = my_realloc_hook; + return result; +} + +static void +my_free_hook (void *ptr, const void *caller) +{ + /* Restore all old hooks */ + __malloc_hook = old_malloc_hook; + __free_hook = old_free_hook; + __realloc_hook = old_realloc_hook; + if (ptr != NULL) + { + ptr -= sizeof (size_t); + size_t size = *(size_t *) ptr; + + memset (ptr, 0xD7, sizeof (size_t) + size); + } + /* Call recursively */ + free (ptr); + /* Restore our own hooks */ + __malloc_hook = my_malloc_hook; + __free_hook = my_free_hook; + __realloc_hook = my_realloc_hook; +} + +static void * +my_realloc_hook (void *ptr, size_t size, const void *caller) +{ + void *result; + size_t old_size = 0; + + /* Restore all old hooks */ + __malloc_hook = old_malloc_hook; + __free_hook = old_free_hook; + __realloc_hook = old_realloc_hook; + if (ptr != NULL) + { + ptr -= sizeof (size_t); + old_size = *(size_t *) ptr; + + if (size < old_size) + memset (ptr + sizeof (size_t) + size, 0x7D, old_size - size); + } + /* Call recursively */ + result = realloc (ptr, (size != 0 ? sizeof (size_t) + size : 0)); + if (result != NULL) + { + *(size_t *) result = size; + result += sizeof (size_t); + if (size > old_size) + memset (result + old_size, 0x3F, size - old_size); + } + /* Restore our own hooks */ + __malloc_hook = my_malloc_hook; + __free_hook = my_free_hook; + __realloc_hook = my_realloc_hook; + return result; +}