-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Open
Labels
Description
Component
chmod
Description
In Chmoder::chmod, the return code is directly set as
if self.recursive {
r = self.walk_dir_with_context(file, true);
} else {
r = self.chmod_file(file).and(r);
}This means that if multiple files are being processed, the return code will be determined solely by the last file processed. If the last file is successful, the return code will be 0, even if previous files encountered errors. This will affect scripts that rely on the exit code to determine if all operations were successful.
Test / Reproduction Steps
core_sbx$ mkdir chmod-bug/user chmod-bug/root
core_sbx$ touch chmod-bug/user/user_owned chmod-bug/root/root_owned
core_sbx$ sudo chown root:root chmod-bug/root/root_owned
core_sbx$ chmod -R 0755 chmod-bug/root chmod-bug/user; echo "gnu ret=$?"
chmod: changing permissions of 'chmod-bug/root/root_owned': Operation not permitted
gnu ret=1
core_sbx$ ../target/release/chmod -R 0755 chmod-bug/root chmod-bug/user; echo "uutils ret=$?"
../target/release/chmod: Operation not permitted (os error 1)
uutils ret=0