summaryrefslogtreecommitdiff
path: root/tests/chmod
diff options
context:
space:
mode:
authorDylan Simon <dylan@dylex.net>2014-03-18 11:50:29 -0400
committerPádraig Brady <P@draigBrady.com>2014-03-19 02:33:44 +0000
commit09eda9ed9d386f3aa84bfff1699cc4cfcec8647e (patch)
tree5909449e495d5080b7999c2c6dd65ff7e6033271 /tests/chmod
parent5b790fda0e3781746451031284ce9730d79c9a89 (diff)
downloadcoreutils-09eda9ed9d386f3aa84bfff1699cc4cfcec8647e.tar.xz
chmod: fix erroneous warnings with -R --changes
For files with "special" bits set, we would stat the relative file name in the wrong directory, giving an erroneous ENOENT diagnostic. This issue was introduced with commit v5.92-653-gc1994c1 which changed fts to not change directory on traversal. * src/chmod.c (mode_changed): Use fts->fts_cwd_fd with fstatat rather than stat. All callers changed. * tests/chmod/c-option.sh: Add a test case. * NEWS: Mention the fix. Fixes http://bugs.gnu.org/17035
Diffstat (limited to 'tests/chmod')
-rwxr-xr-xtests/chmod/c-option.sh11
1 files changed, 11 insertions, 0 deletions
diff --git a/tests/chmod/c-option.sh b/tests/chmod/c-option.sh
index 1dd9b9ea7..a1782c3d8 100755
--- a/tests/chmod/c-option.sh
+++ b/tests/chmod/c-option.sh
@@ -37,4 +37,15 @@ case "$(cat out)" in
*) cat out; fail=1 ;;
esac
+# From V5.1.0 to 8.22 this would stat the wrong file and
+# give an erroneous ENOENT diagnostic
+mkdir -p a/b || framework_failure_
+# chmod g+s might fail as detailed in setgid.sh
+# but we don't care about those edge cases here
+chmod g+s a/b
+# This should never warn, but it did when special
+# bits are set on b (the common case under test)
+chmod -c -R g+w a 2>err
+compare /dev/null err || fail=1
+
Exit $fail