From 90d75218400ed4281216d6f7bcd6b293793c99a5 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Fri, 16 Oct 2026 00:19:49 +0200 Subject: [PATCH] Reject negative or fractional index in file.close Found while testing crates/engine/src/cmd/file.rs:1283 Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/cmd/file.rs | 2 +- crates/engine/src/open_issues_tests.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/cmd/file.rs b/crates/engine/src/cmd/file.rs index 54348372..b8d47277 100644 --- a/crates/engine/src/cmd/file.rs +++ b/crates/engine/src/cmd/file.rs @@ -1280,7 +1280,7 @@ fn append_pages(doc: &mut Document, other: &Document) -> Result> { } fn close(s: &mut Session, p: &Value) -> Result { - let i = num(p, "index").map(|x| x as usize).unwrap_or(s.active); + let i = if get(p, "index").is_none() { s.active } else { req_index("file.close", p, "index")? }; let Some(ds) = s.docs.get(i) else { return Err(bad("file.close", "no such document")) }; // A branch tab's edits are in its main file already (which then has unsaved changes). if ds.branch_of.is_none() && ds.is_dirty() && !boolean(p, "force").unwrap_or(false) { diff --git a/crates/engine/src/open_issues_tests.rs b/crates/engine/src/open_issues_tests.rs index d7f23720..2bee799b 100644 --- a/crates/engine/src/open_issues_tests.rs +++ b/crates/engine/src/open_issues_tests.rs @@ -49,3 +49,16 @@ fn an_intact_file_opens_without_a_message() { assert!(s.message.is_none()); let _ = std::fs::remove_dir_all(path.parent().unwrap()); } + +#[test] +fn file_close_rejects_a_bad_index_instead_of_closing_another_document() { + let mut s = Session::new(); + s.execute("file.new", &json!({})).unwrap(); + s.execute("file.new", &json!({})).unwrap(); + let docs = s.docs.len(); + for index in [json!(-1), json!(1.5), json!(99)] { + let r = s.execute("file.close", &json!({"index": index, "force": true})); + assert!(r.is_err(), "index {index} must be rejected, got {r:?}"); + assert_eq!(s.docs.len(), docs, "index {index} closed a document"); + } +}