From a2c79b14a1aa58424eae77db39ded4d745acce1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 23 Jul 2012 20:14:33 -0400 Subject: [PATCH] tests: Wrap calloc by just returning NULL if we're called too early Since glibc dlsym() calls calloc, we get a call to our calloc wrapper as we try to look up the real calloc implementation. dlsym() will fall back to a static buffer in case calloc returns NULL, so that's what we'll do. This is all highly glibc dependent, of course, but the entire malloc weak symbol wrapper mechanism is, so there's no loss of generality here. --- tests/test-runner.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test-runner.c b/tests/test-runner.c index 5e8ec953..63ce3843 100644 --- a/tests/test-runner.c +++ b/tests/test-runner.c @@ -37,6 +37,7 @@ static int num_alloc; static void* (*sys_malloc)(size_t); static void (*sys_free)(void*); static void* (*sys_realloc)(void*, size_t); +static void* (*sys_calloc)(size_t, size_t); extern const struct test __start_test_section, __stop_test_section; @@ -63,6 +64,17 @@ realloc(void* mem, size_t size) return sys_realloc(mem, size); } +__attribute__ ((visibility("default"))) void * +calloc(size_t nmemb, size_t size) +{ + if (sys_calloc == NULL) + return NULL; + + num_alloc++; + + return sys_calloc(nmemb, size); +} + static const struct test * find_test(const char *name) { @@ -96,6 +108,7 @@ int main(int argc, char *argv[]) siginfo_t info; /* Load system malloc, free, and realloc */ + sys_calloc = dlsym(RTLD_NEXT, "calloc"); sys_realloc = dlsym(RTLD_NEXT, "realloc"); sys_malloc = dlsym(RTLD_NEXT, "malloc"); sys_free = dlsym(RTLD_NEXT, "free");