aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test-runner.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-07-23 20:14:33 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-07-23 20:14:33 -0400
commita2c79b14a1aa58424eae77db39ded4d745acce1d (patch)
tree1801375822132f7f0c7bc36ee2d6855888a7193a /tests/test-runner.c
parenttest-runner: Wrap realloc() too (diff)
downloadwayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.tar
wayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.tar.gz
wayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.tar.bz2
wayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.tar.lz
wayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.tar.xz
wayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.tar.zst
wayland-a2c79b14a1aa58424eae77db39ded4d745acce1d.zip
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.
Diffstat (limited to 'tests/test-runner.c')
-rw-r--r--tests/test-runner.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/tests/test-runner.c b/tests/test-runner.c
index 5e8ec95..63ce384 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");