From bde2028d837cba3511df86ef7c67ee21eeb1ea0e Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Sat, 27 Jan 2024 12:17:15 -0500 Subject: [PATCH] fix(ext/node): limit OpState borrow in op_napi_open (#22151) Fixes #22150 --- ext/napi/lib.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/napi/lib.rs b/ext/napi/lib.rs index 9b09467cdd..5205978918 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( scope: &mut v8::HandleScope<'scope>, - op_state: &mut OpState, + op_state: Rc>, #[string] path: String, global: v8::Local<'scope, v8::Value>, ) -> std::result::Result, AnyError> where NP: NapiPermissions + 'static, { - let permissions = op_state.borrow_mut::(); - 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::(); + permissions.check(Some(&PathBuf::from(&path)))?; let napi_state = op_state.borrow::(); let isolate_ptr = op_state.borrow::<*mut v8::OwnedIsolate>(); (