From 09a79edfb73ba4a55d653e5d5752e3bc08d72712 Mon Sep 17 00:00:00 2001 From: sjh <60695140+cathy-sjh@users.noreply.github.com> Date: Sun, 18 Aug 2024 18:21:13 +0800 Subject: [PATCH] fix(napi,napi-derive): ffi lifetime and pointer sound issues (#2216) * The ownership of the CString will be taken in map function * for empty struct like `#[napi] struct A;`, the `value_ref` will be `0x1`, and it will be overwritten by the others instance of the same class --- crates/backend/src/codegen/struct.rs | 10 ++++++++-- crates/napi/src/env.rs | 6 +++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/crates/backend/src/codegen/struct.rs b/crates/backend/src/codegen/struct.rs index 9ec3465c..05368b4a 100644 --- a/crates/backend/src/codegen/struct.rs +++ b/crates/backend/src/codegen/struct.rs @@ -281,7 +281,10 @@ impl NapiStruct { val: #name ) -> napi::Result { if let Some(ctor_ref) = napi::__private::get_class_constructor(#js_name_str) { - let wrapped_value = Box::into_raw(Box::new(val)); + let mut wrapped_value = Box::into_raw(Box::new(val)); + if wrapped_value as usize == 0x1 { + wrapped_value = Box::into_raw(Box::new(0u8)).cast(); + } let instance_value = #name::new_instance(env, wrapped_value.cast(), ctor_ref)?; #iterator_implementation Ok(instance_value) @@ -299,7 +302,10 @@ impl NapiStruct { pub fn into_reference(val: #name, env: napi::Env) -> napi::Result> { if let Some(ctor_ref) = napi::bindgen_prelude::get_class_constructor(#js_name_str) { unsafe { - let wrapped_value = Box::into_raw(Box::new(val)); + let mut wrapped_value = Box::into_raw(Box::new(val)); + if wrapped_value as usize == 0x1 { + wrapped_value = Box::into_raw(Box::new(0u8)).cast(); + } let instance_value = #name::new_instance(env.raw(), wrapped_value.cast(), ctor_ref)?; { let env = env.raw(); diff --git a/crates/napi/src/env.rs b/crates/napi/src/env.rs index 8e78310c..29bef0f0 100644 --- a/crates/napi/src/env.rs +++ b/crates/napi/src/env.rs @@ -680,7 +680,7 @@ impl Env { check_status!(unsafe { sys::napi_throw_error( self.0, - code.map(|s| s.as_ptr()).unwrap_or(ptr::null_mut()), + code.as_ref().map(|s| s.as_ptr()).unwrap_or(ptr::null_mut()), msg.as_ptr(), ) }) @@ -693,7 +693,7 @@ impl Env { check_status!(unsafe { sys::napi_throw_range_error( self.0, - code.map(|s| s.as_ptr()).unwrap_or(ptr::null_mut()), + code.as_ref().map(|s| s.as_ptr()).unwrap_or(ptr::null_mut()), msg.as_ptr(), ) }) @@ -706,7 +706,7 @@ impl Env { check_status!(unsafe { sys::napi_throw_type_error( self.0, - code.map(|s| s.as_ptr()).unwrap_or(ptr::null_mut()), + code.as_ref().map(|s| s.as_ptr()).unwrap_or(ptr::null_mut()), msg.as_ptr(), ) })