summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/napi/lib.rs9
1 files changed, 6 insertions, 3 deletions
diff --git a/ext/napi/lib.rs b/ext/napi/lib.rs
index 9b09467cd..520597891 100644
--- a/ext/napi/lib.rs
+++ b/ext/napi/lib.rs
@@ -479,15 +479,15 @@ pub unsafe fn weak_local(
#[op2]
fn op_napi_open<NP, 'scope>(
scope: &mut v8::HandleScope<'scope>,
- op_state: &mut OpState,
+ op_state: Rc<RefCell<OpState>>,
#[string] path: String,
global: v8::Local<'scope, v8::Value>,
) -> std::result::Result<v8::Local<'scope, v8::Value>, AnyError>
where
NP: NapiPermissions + 'static,
{
- let permissions = op_state.borrow_mut::<NP>();
- permissions.check(Some(&PathBuf::from(&path)))?;
+ // We must limit the OpState borrow because this function can trigger a
+ // re-borrow through the NAPI module.
let (
async_work_sender,
tsfn_sender,
@@ -495,6 +495,9 @@ where
cleanup_hooks,
tsfn_ref_counters,
) = {
+ let mut op_state = op_state.borrow_mut();
+ let permissions = op_state.borrow_mut::<NP>();
+ permissions.check(Some(&PathBuf::from(&path)))?;
let napi_state = op_state.borrow::<NapiState>();
let isolate_ptr = op_state.borrow::<*mut v8::OwnedIsolate>();
(