From 6d1b5da863e4b599afe2122b19d99c17c23b63d7 Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Tue, 3 Nov 2026 23:48:46 -0500 Subject: [PATCH] fix: create test and benchmark temp directories fresh, never adopt an existing one (#1977) --- apps/figcraft-cli/src/perf.rs | 3 ++- crates/svg/src/import/structure_tests.rs | 5 +++-- crates/text/src/fontdb_tests.rs | 5 ++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/figcraft-cli/src/perf.rs b/apps/figcraft-cli/src/perf.rs index 404724038..30c801207 100644 --- a/apps/figcraft-cli/src/perf.rs +++ b/apps/figcraft-cli/src/perf.rs @@ -498,7 +498,8 @@ fn measure_components(table: &mut Table, col: usize, instances: usize) -> CliRes static RUNS: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(0); let run = RUNS.fetch_add(1, std::sync::atomic::Ordering::Relaxed); let dir = std::env::temp_dir().join(format!("figcraft-perf-{}-{run}", std::process::id())); - std::fs::create_dir_all(&dir).map_err(failed)?; + // `create_dir`, not `create_dir_all`: a directory or link already at this predictable name is refused. + std::fs::create_dir(&dir).map_err(failed)?; let path = dir.join("design-system.figcraft").to_string_lossy().into_owned(); let (lib_doc, lib_ds) = design_system_document(&spec).map_err(failed)?; let mut lib_s = Session::with_document(lib_doc); diff --git a/crates/svg/src/import/structure_tests.rs b/crates/svg/src/import/structure_tests.rs index f16abb66a..f5726f896 100644 --- a/crates/svg/src/import/structure_tests.rs +++ b/crates/svg/src/import/structure_tests.rs @@ -153,8 +153,9 @@ fn an_image_stretched_into_its_box_stays_stretched() { #[test] fn linked_files_are_never_read() { - let dir = std::env::temp_dir().join("figcraft-svg-linked"); - std::fs::create_dir_all(&dir).unwrap(); + let dir = std::env::temp_dir().join(format!("figcraft-svg-linked-{}", std::process::id())); + // `create_dir` refuses a directory or link someone else planted at this name. + std::fs::create_dir(&dir).unwrap(); let png = dir.join("secret.png"); std::fs::write(&png, base64::Engine::decode(&base64::engine::general_purpose::STANDARD, PNG).unwrap()).unwrap(); let href = png.to_string_lossy().replace('\\', "/"); diff --git a/crates/text/src/fontdb_tests.rs b/crates/text/src/fontdb_tests.rs index 5f0fa522b..cb0930e8a 100644 --- a/crates/text/src/fontdb_tests.rs +++ b/crates/text/src/fontdb_tests.rs @@ -139,7 +139,10 @@ fn macos_font_assets_are_found_in_the_asset_store() { let _ = std::fs::remove_dir_all(&self.0); } } - let tmp = TempDir(std::env::temp_dir().join(format!("figcraft-font-assets-{}", std::process::id()))); + // Created fresh: a directory or link already at this predictable name is refused, and not removed. + let root = std::env::temp_dir().join(format!("figcraft-font-assets-{}", std::process::id())); + std::fs::create_dir(&root).unwrap(); + let tmp = TempDir(root); let store = tmp.0.join("AssetsV2"); let fonts = store.join("com_apple_MobileAsset_Font7"); let data = |kind: &std::path::Path| kind.join("0f1e2d.asset").join("AssetData");