diff options
author | Jason Evans <je@fb.com> | 2011-02-14 02:11:54 (GMT) |
---|---|---|
committer | Jason Evans <je@fb.com> | 2011-02-14 02:11:54 (GMT) |
commit | 9dcad2dfd11762ea3b542ef45a20bd8297c6f18c (patch) | |
tree | f2ce6dda64a1c952aa79e891ad8a6f0d632e7967 /jemalloc/test | |
parent | 6369286f83e800de8753732031289fd6393027e7 (diff) | |
download | jemalloc-9dcad2dfd11762ea3b542ef45a20bd8297c6f18c.zip jemalloc-9dcad2dfd11762ea3b542ef45a20bd8297c6f18c.tar.gz jemalloc-9dcad2dfd11762ea3b542ef45a20bd8297c6f18c.tar.bz2 |
Fix "thread.{de,}allocatedp" mallctl.
For the non-TLS case (as on OS X), if the "thread.{de,}allocatedp"
mallctl was called before any allocation occurred for that thread, the
TSD was still NULL, thus putting the application at risk of
dereferencing NULL. Fix this by refactoring the initialization code,
and making it part of the conditional logic for all per thread
allocation counter accesses.
Diffstat (limited to 'jemalloc/test')
-rw-r--r-- | jemalloc/test/allocated.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/jemalloc/test/allocated.c b/jemalloc/test/allocated.c index 64a1735..b1e40e4 100644 --- a/jemalloc/test/allocated.c +++ b/jemalloc/test/allocated.c @@ -16,6 +16,7 @@ thread_start(void *arg) int err; void *p; uint64_t a0, a1, d0, d1; + uint64_t *ap0, *ap1, *dp0, *dp1; size_t sz, usize; sz = sizeof(a0); @@ -31,6 +32,20 @@ thread_start(void *arg) strerror(err)); exit(1); } + sz = sizeof(ap0); + if ((err = JEMALLOC_P(mallctl)("thread.allocatedp", &ap0, &sz, NULL, + 0))) { + if (err == ENOENT) { +#ifdef JEMALLOC_STATS + assert(false); +#endif + goto RETURN; + } + fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__, + strerror(err)); + exit(1); + } + assert(*ap0 == a0); sz = sizeof(d0); if ((err = JEMALLOC_P(mallctl)("thread.deallocated", &d0, &sz, NULL, @@ -45,6 +60,20 @@ thread_start(void *arg) strerror(err)); exit(1); } + sz = sizeof(dp0); + if ((err = JEMALLOC_P(mallctl)("thread.deallocatedp", &dp0, &sz, NULL, + 0))) { + if (err == ENOENT) { +#ifdef JEMALLOC_STATS + assert(false); +#endif + goto RETURN; + } + fprintf(stderr, "%s(): Error in mallctl(): %s\n", __func__, + strerror(err)); + exit(1); + } + assert(*dp0 == d0); p = JEMALLOC_P(malloc)(1); if (p == NULL) { @@ -54,6 +83,10 @@ thread_start(void *arg) sz = sizeof(a1); JEMALLOC_P(mallctl)("thread.allocated", &a1, &sz, NULL, 0); + sz = sizeof(ap1); + JEMALLOC_P(mallctl)("thread.allocatedp", &ap1, &sz, NULL, 0); + assert(*ap1 == a1); + assert(ap0 == ap1); usize = JEMALLOC_P(malloc_usable_size)(p); assert(a0 + usize <= a1); @@ -62,6 +95,10 @@ thread_start(void *arg) sz = sizeof(d1); JEMALLOC_P(mallctl)("thread.deallocated", &d1, &sz, NULL, 0); + sz = sizeof(dp1); + JEMALLOC_P(mallctl)("thread.deallocatedp", &dp1, &sz, NULL, 0); + assert(*dp1 == d1); + assert(dp0 == dp1); assert(d0 + usize <= d1); |