chmod: fix error handling if multiple files are handled (#9793)

* chmod: fix error handling if multiple files are handled

* chmod: add regression test for correct exit codes

* chmod: fix test expected error msg

---------

Co-authored-by: Sylvestre Ledru <sylvestre@debian.org>
This commit is contained in:
cerdelen
2026-01-01 11:41:05 +01:00
committed by GitHub
co-authored by Sylvestre Ledru
parent ef215d4971
commit abd581f62e
2 changed files with 33 additions and 1 deletions
+1 -1
View File
@@ -411,7 +411,7 @@ impl Chmoder {
return Err(ChmodError::PreserveRoot("/".into()).into());
}
if self.recursive {
r = self.walk_dir_with_context(file, true);
r = self.walk_dir_with_context(file, true).and(r);
} else {
r = self.chmod_file(file).and(r);
}
+32
View File
@@ -375,6 +375,38 @@ fn test_permission_denied() {
.stderr_is("chmod: cannot access 'd/no-x/y': Permission denied\n");
}
#[test]
#[allow(clippy::unreadable_literal)]
fn test_chmod_recursive_correct_exit_code() {
let (at, mut ucmd) = at_and_ucmd!();
// create 3 folders to test on
at.mkdir("a");
at.mkdir("a/b");
at.mkdir("z");
// remove read permissions for folder a so the chmod command for a/b fails
let mut perms = at.metadata("a").permissions();
perms.set_mode(0o000);
set_permissions(at.plus_as_string("a"), perms).unwrap();
#[cfg(not(target_os = "linux"))]
let err_msg = "chmod: Permission denied\n";
#[cfg(target_os = "linux")]
let err_msg = "chmod: cannot access 'a': Permission denied\n";
// order of command is a, a/b then c
// command is expected to fail and not just take the last exit code
ucmd.arg("-R")
.arg("--verbose")
.arg("a+w")
.arg("a")
.arg("z")
.umask(0)
.fails()
.stderr_is(err_msg);
}
#[test]
#[allow(clippy::unreadable_literal)]
fn test_chmod_recursive() {