From f8f0fce015009d958e37ada8aa5b3dc0bf2425e9 Mon Sep 17 00:00:00 2001 From: Aidan Harris Date: Fri, 20 Oct 2023 18:47:43 +0000 Subject: [PATCH 1/3] Use XDG_CACHE_HOME if /tmp is mounted with noexec Fixes #1611 --- Cargo.lock | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 2 ++ src/recipe.rs | 8 ++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 4aa30724fe..536573d08c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -156,6 +156,27 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -326,6 +347,7 @@ dependencies = [ "cradle", "ctrlc", "derivative", + "dirs", "dotenvy", "edit-distance", "env_logger", @@ -334,6 +356,7 @@ dependencies = [ "lexiclean", "libc", "log", + "mnt", "num_cpus", "pretty_assertions", "regex", @@ -395,6 +418,15 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "mnt" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1587ebb20a5b04738f16cffa7e2526f1b8496b84f92920facd518362ff1559eb" +dependencies = [ + "libc", +] + [[package]] name = "nix" version = "0.27.1" @@ -422,6 +454,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "pretty_assertions" version = "1.4.0" @@ -495,6 +533,15 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -504,6 +551,17 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall 0.2.16", + "thiserror", +] + [[package]] name = "ref-type" version = "0.0.0" @@ -735,7 +793,7 @@ checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "redox_syscall 0.3.5", "rustix", "windows-sys", ] @@ -778,6 +836,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "typed-arena" version = "2.0.2" diff --git a/Cargo.toml b/Cargo.toml index 20ba6d92dc..6cafb05e5e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ camino = "1.0.4" clap = { version = "2.33.0", features = ["wrap_help"] } ctrlc = { version = "3.1.1", features = ["termination"] } derivative = "2.0.0" +dirs = "5.0.1" dotenvy = "0.15" edit-distance = "2.0.0" env_logger = "0.10.0" @@ -31,6 +32,7 @@ heck = "0.4.0" lexiclean = "0.0.1" libc = "0.2.0" log = "0.4.4" +mnt = "0.3.1" num_cpus = "1.15.0" regex = "1.5.4" serde = { version = "1.0.130", features = ["derive", "rc"] } diff --git a/src/recipe.rs b/src/recipe.rs index 407115d735..43fcaa62d4 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -274,6 +274,14 @@ impl<'src, D> Recipe<'src, D> { message: format!("bad shebang line: {shebang_line}"), })?; + if cfg!(unix) { + let mnt_point = mnt::get_mount(env::temp_dir()).unwrap(); + if mnt_point.clone().unwrap().mntops.contains(&mnt::MntOps::Exec(false)) { + let cache_dir = dirs::cache_dir().unwrap(); + env::set_var("TMPDIR", cache_dir); + } + } + let mut tempdir_builder = tempfile::Builder::new(); tempdir_builder.prefix("just"); let tempdir = match &context.settings.tempdir { From a7f1ef4bf0e87994d7756c928c4051ae8d5a8cbc Mon Sep 17 00:00:00 2001 From: Aidan Harris Date: Fri, 20 Oct 2023 19:01:18 +0000 Subject: [PATCH 2/3] update test to not fail when /tmp is mounted with noexec --- tests/tempdir.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/tempdir.rs b/tests/tempdir.rs index 2e48c9c533..1d5f26cca9 100644 --- a/tests/tempdir.rs +++ b/tests/tempdir.rs @@ -1,6 +1,19 @@ use super::*; pub(crate) fn tempdir() -> TempDir { + if cfg!(unix) { + let mnt_point = mnt::get_mount(env::temp_dir()).unwrap(); + if mnt_point + .clone() + .unwrap() + .mntops + .contains(&mnt::MntOps::Exec(false)) + { + let cache_dir = dirs::cache_dir().unwrap(); + env::set_var("TMPDIR", cache_dir); + } + } + tempfile::Builder::new() .prefix("just-test-tempdir") .tempdir() From 64c31b8d267f043b869b1dbec6f3b56072facc7f Mon Sep 17 00:00:00 2001 From: Aidan Harris Date: Fri, 20 Oct 2023 19:01:38 +0000 Subject: [PATCH 3/3] cargo fmt --- src/recipe.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/recipe.rs b/src/recipe.rs index 43fcaa62d4..42a117d8f4 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -276,7 +276,12 @@ impl<'src, D> Recipe<'src, D> { if cfg!(unix) { let mnt_point = mnt::get_mount(env::temp_dir()).unwrap(); - if mnt_point.clone().unwrap().mntops.contains(&mnt::MntOps::Exec(false)) { + if mnt_point + .clone() + .unwrap() + .mntops + .contains(&mnt::MntOps::Exec(false)) + { let cache_dir = dirs::cache_dir().unwrap(); env::set_var("TMPDIR", cache_dir); }