summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2020-05-15 16:32:52 +0200
committerGitHub <noreply@github.com>2020-05-15 16:32:52 +0200
commit89fe81168e75a375a67e9d391b367d2a9749153c (patch)
tree167624ec7acdb899e0ddf6a2a45fc093a5c44fc5
parentd4afc9890dfa60a233167e2ea003d9e7c830ee61 (diff)
fix: panic if $DENO_DIR is a relative path (#5375)
This commit fixes panic occurring if $DENO_DIR is set to a relative path, eg. "DENO_DIR=denodir deno run main.ts". Before creating DenoDir instance given path is checked and if necessary resolved against current working directory. Additional sanity checks were put in place to ensure all caches receive absolute path for the location.
-rw-r--r--cli/deno_dir.rs13
-rw-r--r--cli/disk_cache.rs9
-rw-r--r--cli/http_cache.rs3
3 files changed, 22 insertions, 3 deletions
diff --git a/cli/deno_dir.rs b/cli/deno_dir.rs
index 645a053d0..3224fbf46 100644
--- a/cli/deno_dir.rs
+++ b/cli/deno_dir.rs
@@ -13,7 +13,7 @@ pub struct DenoDir {
}
impl DenoDir {
- pub fn new(custom_root: Option<PathBuf>) -> std::io::Result<Self> {
+ pub fn new(maybe_custom_root: Option<PathBuf>) -> std::io::Result<Self> {
// Only setup once.
let home_dir = dirs::home_dir().expect("Could not get home directory.");
let fallback = home_dir.join(".deno");
@@ -24,7 +24,16 @@ impl DenoDir {
.map(|d| d.join("deno"))
.unwrap_or(fallback);
- let root: PathBuf = custom_root.unwrap_or(default);
+ let root: PathBuf = if let Some(root) = maybe_custom_root {
+ if root.is_absolute() {
+ root
+ } else {
+ std::env::current_dir()?.join(root)
+ }
+ } else {
+ default
+ };
+ assert!(root.is_absolute());
let gen_path = root.join("gen");
let deno_dir = Self {
diff --git a/cli/disk_cache.rs b/cli/disk_cache.rs
index f486e88af..828ca90ca 100644
--- a/cli/disk_cache.rs
+++ b/cli/disk_cache.rs
@@ -22,7 +22,9 @@ fn with_io_context<T: AsRef<str>>(
}
impl DiskCache {
+ /// `location` must be an absolute path.
pub fn new(location: &Path) -> Self {
+ assert!(location.is_absolute());
Self {
location: location.to_owned(),
}
@@ -211,7 +213,12 @@ mod tests {
#[test]
fn test_get_cache_filename_with_extension() {
- let cache = DiskCache::new(&PathBuf::from("foo"));
+ let p = if cfg!(target_os = "windows") {
+ "C:\\foo"
+ } else {
+ "/foo"
+ };
+ let cache = DiskCache::new(&PathBuf::from(p));
let mut test_cases = vec![
(
diff --git a/cli/http_cache.rs b/cli/http_cache.rs
index 2771cb763..2a9882376 100644
--- a/cli/http_cache.rs
+++ b/cli/http_cache.rs
@@ -103,7 +103,10 @@ impl Metadata {
impl HttpCache {
/// Returns a new instance.
+ ///
+ /// `location` must be an absolute path.
pub fn new(location: &Path) -> Self {
+ assert!(location.is_absolute());
Self {
location: location.to_owned(),
}