summaryrefslogtreecommitdiffstats
path: root/jemalloc/test
diff options
context:
space:
mode:
authorJason Evans <je@fb.com>2011-02-14 02:11:54 (GMT)
committerJason Evans <je@fb.com>2011-02-14 02:11:54 (GMT)
commit9dcad2dfd11762ea3b542ef45a20bd8297c6f18c (patch)
treef2ce6dda64a1c952aa79e891ad8a6f0d632e7967 /jemalloc/test
parent6369286f83e800de8753732031289fd6393027e7 (diff)
downloadjemalloc-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.c37
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);