From e70484bfd56a7a47fa3ecd739cb1e581ecb69ade Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Thu, 24 Feb 2022 22:10:45 +0000 Subject: [PATCH] Fix drop order for Module fields The field ordering here is actually significant because of the drop order: we want to drop the artifact before dropping the engine. The reason for this is that dropping the Artifact will de-register the trap handling metadata from the global registry. This must be done before the code memory for the artifact is freed (which happens when the store is dropped) since there is a chance that this memory could be reused by another module which will try to register its own trap information. Note that in Rust, the drop order for struct fields is from top to bottom: the opposite of C++. In the future, this code should be refactored to properly describe the ownership of the code and its metadata. Fixes #2434 --- lib/api/src/module.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/api/src/module.rs b/lib/api/src/module.rs index 6d936a5f3d8..0d617635373 100644 --- a/lib/api/src/module.rs +++ b/lib/api/src/module.rs @@ -33,8 +33,22 @@ pub enum IoCompileError { /// contents rather than a deep copy. #[derive(Clone, MemoryUsage)] pub struct Module { - store: Store, + // The field ordering here is actually significant because of the drop + // order: we want to drop the artifact before dropping the engine. + // + // The reason for this is that dropping the Artifact will de-register the + // trap handling metadata from the global registry. This must be done before + // the code memory for the artifact is freed (which happens when the store + // is dropped) since there is a chance that this memory could be reused by + // another module which will try to register its own trap information. + // + // Note that in Rust, the drop order for struct fields is from top to + // bottom: the opposite of C++. + // + // In the future, this code should be refactored to properly describe the + // ownership of the code and its metadata. artifact: Arc, + store: Store, } impl Module {