tests: Wrap calloc by just returning NULL if we're called too early
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 24 Jul 2012 00:14:33 +0000 (20:14 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 24 Jul 2012 00:14:33 +0000 (20:14 -0400)
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

index 5e8ec95..63ce384 100644 (file)
@@ -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");