Merge pull request #2462 from Skgland/fix-segfault
fix segfault by dropping loader state payload after resetting machine
This commit is contained in:
@@ -305,9 +305,11 @@ impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T> {
|
|||||||
|
|
||||||
impl<P, T: ?Sized + ArenaAllocated<Payload = ManuallyDrop<P>>> TypedArenaPtr<T> {
|
impl<P, T: ?Sized + ArenaAllocated<Payload = ManuallyDrop<P>>> TypedArenaPtr<T> {
|
||||||
pub fn drop_payload(&mut self) {
|
pub fn drop_payload(&mut self) {
|
||||||
|
if self.get_tag() != ArenaHeaderTag::Dropped {
|
||||||
self.set_tag(ArenaHeaderTag::Dropped);
|
self.set_tag(ArenaHeaderTag::Dropped);
|
||||||
unsafe { ManuallyDrop::drop(&mut *self.as_ptr()) }
|
unsafe { ManuallyDrop::drop(&mut *self.as_ptr()) }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T>
|
impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T>
|
||||||
|
|||||||
@@ -323,8 +323,8 @@ impl<'a> LoadState<'a> for LiveLoadAndMachineState<'a> {
|
|||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn reset_machine(loader: &mut Loader<'a, Self>) {
|
fn reset_machine(loader: &mut Loader<'a, Self>) {
|
||||||
if loader.payload.load_state.get_tag() != ArenaHeaderTag::Dropped {
|
if loader.payload.load_state.get_tag() != ArenaHeaderTag::Dropped {
|
||||||
loader.payload.load_state.drop_payload();
|
|
||||||
loader.reset_machine();
|
loader.reset_machine();
|
||||||
|
loader.payload.load_state.drop_payload();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user