diff --git a/src/extent.c b/src/extent.c index 824b08d4..841afa42 100644 --- a/src/extent.c +++ b/src/extent.c @@ -441,6 +441,7 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, lead, leadsize, leadsize, size + trailsize, usize + trailsize); if (extent == NULL) { + extent_deregister(tsdn, lead); extent_leak(tsdn, arena, r_extent_hooks, cache, lead); malloc_mutex_unlock(tsdn, &arena->extents_mtx); return (NULL); @@ -454,6 +455,7 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, extent_t *trail = extent_split_wrapper(tsdn, arena, r_extent_hooks, extent, size, usize, trailsize, trailsize); if (trail == NULL) { + extent_deregister(tsdn, extent); extent_leak(tsdn, arena, r_extent_hooks, cache, extent); malloc_mutex_unlock(tsdn, &arena->extents_mtx); @@ -961,7 +963,7 @@ extent_split_wrapper(tsdn_t *tsdn, arena_t *arena, return (trail); label_error_d: - extent_rtree_release(tsdn, lead_elm_a, lead_elm_b); + extent_rtree_release(tsdn, trail_elm_a, trail_elm_b); label_error_c: extent_rtree_release(tsdn, lead_elm_a, lead_elm_b); label_error_b: diff --git a/test/integration/xallocx.c b/test/integration/xallocx.c index 72db818a..4dcf08da 100644 --- a/test/integration/xallocx.c +++ b/test/integration/xallocx.c @@ -258,7 +258,7 @@ TEST_BEGIN(test_extra_large) "Unexpected xallocx() behavior"); assert_zu_eq(xallocx(p, large2, large3 - large2, flags), large3, "Unexpected xallocx() behavior"); - assert_zu_eq(xallocx(p, large1, large2 - large1, flags), large2, + assert_zu_ge(xallocx(p, large1, large2 - large1, flags), large2, "Unexpected xallocx() behavior"); assert_zu_ge(xallocx(p, smallmax, large1 - smallmax, flags), large1, "Unexpected xallocx() behavior"); @@ -357,8 +357,10 @@ test_zero(size_t szmin, size_t szmax) /* Shrink in place so that we can expect growing in place to succeed. */ sz = szmin; - assert_zu_eq(xallocx(p, sz, 0, flags), sz, - "Unexpected xallocx() error"); + if (xallocx(p, sz, 0, flags) != sz) { + p = rallocx(p, sz, flags); + assert_ptr_not_null(p, "Unexpected rallocx() failure"); + } assert_false(validate_fill(p, FILL_BYTE, 0, sz), "Memory not filled: sz=%zu", sz);