diff options
Diffstat (limited to 'cli/npm/managed/resolvers/common.rs')
-rw-r--r-- | cli/npm/managed/resolvers/common.rs | 47 |
1 files changed, 25 insertions, 22 deletions
diff --git a/cli/npm/managed/resolvers/common.rs b/cli/npm/managed/resolvers/common.rs index 227805d4e..a326b562b 100644 --- a/cli/npm/managed/resolvers/common.rs +++ b/cli/npm/managed/resolvers/common.rs @@ -9,6 +9,7 @@ use std::sync::Mutex; use async_trait::async_trait; use deno_ast::ModuleSpecifier; +use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::futures; use deno_core::unsync::spawn; @@ -91,29 +92,31 @@ impl RegistryReadPermissionChecker { if is_path_in_node_modules { let mut cache = self.cache.lock().unwrap(); - let registry_path_canon = match cache.get(&self.registry_path) { - Some(canon) => canon.clone(), - None => { - let canon = self.fs.realpath_sync(&self.registry_path)?; - cache.insert(self.registry_path.to_path_buf(), canon.clone()); - canon - } - }; - - let path_canon = match cache.get(path) { - Some(canon) => canon.clone(), - None => { - let canon = self.fs.realpath_sync(path); - if let Err(e) = &canon { - if e.kind() == ErrorKind::NotFound { - return Ok(()); - } + let mut canonicalize = + |path: &Path| -> Result<Option<PathBuf>, AnyError> { + match cache.get(path) { + Some(canon) => Ok(Some(canon.clone())), + None => match self.fs.realpath_sync(path) { + Ok(canon) => { + cache.insert(path.to_path_buf(), canon.clone()); + Ok(Some(canon)) + } + Err(e) => { + if e.kind() == ErrorKind::NotFound { + return Ok(None); + } + Err(AnyError::from(e)).with_context(|| { + format!("failed canonicalizing '{}'", path.display()) + }) + } + }, } - - let canon = canon?; - cache.insert(path.to_path_buf(), canon.clone()); - canon - } + }; + let Some(registry_path_canon) = canonicalize(&self.registry_path)? else { + return Ok(()); // not exists, allow reading + }; + let Some(path_canon) = canonicalize(path)? else { + return Ok(()); // not exists, allow reading }; if path_canon.starts_with(registry_path_canon) { |