From c3e0b12c72673badece8ef5d789a942637d893ba Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Mon, 23 Jan 2023 05:29:46 -0800 Subject: fix(napi): handle return value from initializer (#17502) Fixes https://github.com/denoland/deno/issues/17349 --- ext/napi/lib.rs | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'ext') diff --git a/ext/napi/lib.rs b/ext/napi/lib.rs index a304a8818..b4f38fd0a 100644 --- a/ext/napi/lib.rs +++ b/ext/napi/lib.rs @@ -678,7 +678,7 @@ where let nm = unsafe { &*nm }; assert_eq!(nm.nm_version, 1); // SAFETY: we are going blind, calling the register function on the other side. - let exports = unsafe { + let maybe_exports = unsafe { (nm.nm_register_func)( env_ptr, std::mem::transmute::, napi_value>( @@ -687,11 +687,20 @@ where ) }; - // SAFETY: v8::Local is a pointer to a value and napi_value is also a pointer - // to a value, they have the same layout - let exports = unsafe { - std::mem::transmute::>(exports) - }; + let exports = maybe_exports + .as_ref() + .map(|_| unsafe { + // SAFETY: v8::Local is a pointer to a value and napi_value is also a pointer + // to a value, they have the same layout + std::mem::transmute::>( + maybe_exports, + ) + }) + .unwrap_or_else(|| { + // If the module didn't return anything, we use the exports object. + exports.into() + }); + Ok(serde_v8::Value { v8_value: exports }) } None => { @@ -704,17 +713,29 @@ where exports: napi_value, ) -> napi_value>(b"napi_register_module_v1") .expect("napi_register_module_v1 not found"); - init( + let maybe_exports = init( env_ptr, std::mem::transmute::, napi_value>( exports.into(), ), - ) - }; - - Ok(serde_v8::Value { - v8_value: exports.into(), - }) + ); + + let exports = maybe_exports + .as_ref() + .map(|_| { + // SAFETY: v8::Local is a pointer to a value and napi_value is also a pointer + // to a value, they have the same layout + std::mem::transmute::>( + maybe_exports, + ) + }) + .unwrap_or_else(|| { + // If the module didn't return anything, we use the exports object. + exports.into() + }); + + Ok(serde_v8::Value { v8_value: exports }) + } } }; // NAPI addons can't be unloaded, so we're going to "forget" the library -- cgit v1.2.3