From 89c1ea4232e4c2b66758b32c00e6adadea1acd3b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bennet=20Ble=C3=9Fmann?= Date: Sat, 6 Jul 2024 23:08:21 +0200 Subject: [PATCH] fix leak of ArenaAllocated IndexPtr --- src/arena.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/arena.rs b/src/arena.rs index fb42ac17..75ac69f0 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -627,6 +627,12 @@ impl ArenaAllocated for IndexPtr { arena.base = Some(NonNull::new(raw_box).unwrap()); allocated_ptr } + + /// # Safety + /// - ptr points to an allocated slab of the correct kind + unsafe fn dealloc(ptr: NonNull>) { + drop(unsafe { Box::from_raw(ptr.as_ptr().cast::()) }); + } } #[repr(C)] @@ -768,11 +774,15 @@ unsafe fn drop_slab_in_place(value: NonNull) { ArenaHeaderTag::StandardErrorStream => { drop_typed_slab_in_place!(StandardErrorStream, value); } - ArenaHeaderTag::NullStream - | ArenaHeaderTag::IndexPtrUndefined + ArenaHeaderTag::IndexPtrUndefined | ArenaHeaderTag::IndexPtrDynamicUndefined | ArenaHeaderTag::IndexPtrDynamicIndex - | ArenaHeaderTag::IndexPtrIndex => {} + | ArenaHeaderTag::IndexPtrIndex => { + drop_typed_slab_in_place!(IndexPtr, value); + } + ArenaHeaderTag::NullStream => { + unreachable!("NullStream is never arena allocated!"); + } } } -- 2.54.0