]> Repositorios git - scryer-prolog.git/commitdiff
prevent accidental double free by checking tag before drop
authorBennet Bleßmann <[email protected]>
Sat, 3 Aug 2024 17:36:05 +0000 (19:36 +0200)
committerBennet Bleßmann <[email protected]>
Sat, 3 Aug 2024 17:36:05 +0000 (19:36 +0200)
src/arena.rs

index a3449d44b904ed04e145fdcf37e2783244649abd..6acb279bcfeed62a70be63d123421d35672b16e3 100644 (file)
@@ -305,8 +305,10 @@ impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T> {
 
 impl<P, T: ?Sized + ArenaAllocated<Payload = ManuallyDrop<P>>> TypedArenaPtr<T> {
     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()) }
+        }
     }
 }