From 1563ffb3018b413b63ac287431e3e9423b1320cf Mon Sep 17 00:00:00 2001 From: "Dylan M. Taylor" Date: Tue, 10 Nov 2026 22:11:15 +0000 Subject: [PATCH] address review: fail closed when the numbered-folder scan cannot list its parent; unix-only symlink test --- crates/automation/src/confine.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/automation/src/confine.rs b/crates/automation/src/confine.rs index d395e943a..e80f6a566 100644 --- a/crates/automation/src/confine.rs +++ b/crates/automation/src/confine.rs @@ -206,7 +206,13 @@ impl Confinement { let sep = ['/', '\\']; let Some((dir_tail, rest)) = after.split_once(sep) else { return Ok(()) }; let (parent, prefix) = before.rsplit_once(sep).unwrap_or(("", &before)); - let Ok(entries) = std::fs::read_dir(if parent.is_empty() { Path::new("/") } else { Path::new(parent) }) else { return Ok(()) }; + // A parent that doesn't exist has no numbered folders; one that can't be listed might. + let scan = if parent.is_empty() { Path::new("/") } else { Path::new(parent) }; + let entries = match std::fs::read_dir(scan) { + Ok(entries) => entries, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(()), + Err(e) => return Err(Error::BadArgs(format!("cannot render to `{output}`: its numbered folders in `{}` can't be checked: {e}", scan.display()))), + }; let mut seen = 0; for e in entries.flatten() { let name = e.file_name().to_string_lossy().into_owned(); @@ -750,6 +756,7 @@ mod tests { let _ = std::fs::remove_dir_all(&base); } + #[cfg(unix)] #[test] fn numbered_render_folders_with_links_out_of_the_write_roots_are_refused() { let base = std::env::temp_dir().join(format!("ec-confine-seq-dir-{}", std::process::id()));