From 4d3ceb387e290bd80fbbcb476d9353602740e428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Sat, 3 Aug 2024 19:27:32 +0200 Subject: [PATCH 1/2] drop payload after resetting machine - under some circumstances the payload is accessed durring reset which would cause a segfault if we drop the payload too early --- src/machine/loader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/loader.rs b/src/machine/loader.rs index 07efb58a..87483dce 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -323,8 +323,8 @@ impl<'a> LoadState<'a> for LiveLoadAndMachineState<'a> { #[inline(always)] fn reset_machine(loader: &mut Loader<'a, Self>) { if loader.payload.load_state.get_tag() != ArenaHeaderTag::Dropped { - loader.payload.load_state.drop_payload(); loader.reset_machine(); + loader.payload.load_state.drop_payload(); } } From 9e8d8aa19e4a2512042e8d1221ec9a0438c22e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Sat, 3 Aug 2024 19:36:05 +0200 Subject: [PATCH 2/2] prevent accidental double free by checking tag before drop --- src/arena.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/arena.rs b/src/arena.rs index a3449d44..6acb279b 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -305,8 +305,10 @@ impl TypedArenaPtr { impl>> TypedArenaPtr { pub fn drop_payload(&mut self) { - self.set_tag(ArenaHeaderTag::Dropped); - unsafe { ManuallyDrop::drop(&mut *self.as_ptr()) } + if self.get_tag() != ArenaHeaderTag::Dropped { + self.set_tag(ArenaHeaderTag::Dropped); + unsafe { ManuallyDrop::drop(&mut *self.as_ptr()) } + } } }