From 6dd8751d24286d25d3da8de32863d3950fcd7441 Mon Sep 17 00:00:00 2001 From: Coro Date: Fri, 21 Aug 2026 15:41:38 -0600 Subject: [PATCH] find: reject the deprecated -perm +MODE octal form to match GNU --- src/find/matchers/perm.rs | 7 +++++++ tests/test_find.rs | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/find/matchers/perm.rs b/src/find/matchers/perm.rs index a8a52a38..2c66089f 100644 --- a/src/find/matchers/perm.rs +++ b/src/find/matchers/perm.rs @@ -53,6 +53,13 @@ mod parsing { } pub fn parse_mode(pattern: &str, for_dir: bool) -> Result> { + // GNU rejects the old `-perm +MODE` octal form; a leading + needs a symbolic mode. + if let Some(rest) = pattern.strip_prefix('+') { + if rest.contains(|c: char| c.is_ascii_digit()) { + return Err(From::from(format!("invalid mode '+{rest}'"))); + } + } + let mode = if pattern.contains(|c: char| c.is_ascii_digit()) { parse_numeric(0, pattern, for_dir)? } else { diff --git a/tests/test_find.rs b/tests/test_find.rs index b9c73d5f..286a01b4 100644 --- a/tests/test_find.rs +++ b/tests/test_find.rs @@ -790,6 +790,21 @@ fn find_perm() { ucmd().args(&["-perm", "u=g"]).succeeds(); } +#[cfg(unix)] +#[test] +fn find_perm_plus_octal_is_rejected() { + // GNU find rejects the deprecated `-perm +MODE` octal form; only symbolic + // modes may follow a leading `+`. + ucmd() + .args(&["-perm", "+644"]) + .fails() + .stderr_contains("invalid mode '+644'"); + ucmd() + .args(&["-perm", "+0"]) + .fails() + .stderr_contains("invalid mode '+0'"); +} + #[cfg(unix)] #[test] fn find_inum() {