summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-05-26 01:15:41 (GMT)
committerJason Evans <jasone@canonware.com>2017-05-30 00:27:18 (GMT)
commita16114866a8e52a4fc8057d5c3123e2dc5c0ceab (patch)
tree97126db061a3c25d960f9128eb8fe7a95d321756
parentd5ef5ae9344d72f39569a05e7c9349dded497e41 (diff)
downloadjemalloc-a16114866a8e52a4fc8057d5c3123e2dc5c0ceab.zip
jemalloc-a16114866a8e52a4fc8057d5c3123e2dc5c0ceab.tar.gz
jemalloc-a16114866a8e52a4fc8057d5c3123e2dc5c0ceab.tar.bz2
Fix OOM paths in extent_grow_retained().
-rw-r--r--src/extent.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/extent.c b/src/extent.c
index fee8198..7359a55 100644
--- a/src/extent.c
+++ b/src/extent.c
@@ -1046,10 +1046,15 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
extent_init(extent, arena, ptr, alloc_size, false, NSIZES,
arena_extent_sn_next(arena), extent_state_active, zeroed,
committed);
- if (ptr == NULL || extent_register_no_gdump_add(tsdn, extent)) {
+ if (ptr == NULL) {
extent_dalloc(tsdn, arena, extent);
return NULL;
}
+ if (extent_register_no_gdump_add(tsdn, extent)) {
+ extents_leak(tsdn, arena, r_extent_hooks,
+ &arena->extents_retained, extent);
+ return NULL;
+ }
size_t leadsize = ALIGNMENT_CEILING((uintptr_t)ptr,
PAGE_CEILING(alignment)) - (uintptr_t)ptr;
@@ -1070,7 +1075,8 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
leadsize, NSIZES, false, esize + trailsize, szind, slab);
if (extent == NULL) {
extent_deregister(tsdn, lead);
- extents_leak(tsdn, arena, r_extent_hooks, false, lead);
+ extents_leak(tsdn, arena, r_extent_hooks,
+ &arena->extents_retained, lead);
return NULL;
}
extent_record(tsdn, arena, r_extent_hooks,