Code change:
<!-- Note that these are hard requirements --<!-- You can use the "Go to file" functionality on GitHub to find the package Then you can go to the history for this package Find the latest "packagename: oldversion -newversion" commit The "newversion" is the current version of the package --- <!-- Type the name of your package and try to find an open pull request for the package If you find an open pull request, you can review it! There's a high chance that you'll have the new version right away while helping the community! --- name: coreutils <!-- The current version can be found easily with the same process as above for checking the master branch If an open PR is present for the package, take this version as the current one and link to the PR --current version: 9.0 desired version: 9.1 <!-- Search your package here: If no maintainer is listed for your package, tag the person that last updated the package --maintainers: Please tag this issue in your PR.
I'm already on it :) might take some while before I do the pr because I want to build stdenv first

Related discussion:
text: <del> From e8b56ebd536e82b15542a00c888109471936bfda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com> Date: Fri, 24 Sep 2021 20:57:41 +0100 Subject: [PATCH] chmod: fix exit status when ignoring symlinks * src/chmod.c: Reorder enum so CH_NOT_APPLIED can be treated as a non error. * tests/chmod/ignore-symlink.sh: A new test. * tests/local.mk: Reference the new test. * NEWS: Mention the bug fix. Fixes https://bugs.gnu.org/50784 --- NEWS                          |  6 ++++++ src/chmod.c                   |  4 ++-- tests/chmod/ignore-symlink.sh | 31 +++++++++++++++++++++++++++++++ tests/local.mk                |  1 + 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100755 tests/chmod/ignore-symlink.sh diff --git a/NEWS b/NEWS index a1470a7d7..1cb3c28a1 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU coreutils NEWS                                    -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + +  chmod -R no longer exits with error status when encountering symlinks. +  All files would be processed correctly, but the exit status was incorrect. +  [bug introduced in coreutils-9.0] + * Noteworthy changes in release 9.0 (2021-09-24) [stable] diff --git a/src/chmod.c b/src/chmod.c index 37b04f500..57ac47f33 100644 --- a/src/chmod.c +++ b/src/chmod.c @@ -44,8 +44,8 @@ struct change_status enum { CH_NO_STAT, -      CH_NOT_APPLIED, CH_FAILED, +      CH_NOT_APPLIED, CH_NO_CHANGE_REQUESTED, CH_SUCCEEDED } @@ -322,7 +322,7 @@ process_file (FTS *fts, FTSENT *ent) if ( ! recurse) fts_set (fts, ent, FTS_SKIP); -  return CH_NO_CHANGE_REQUESTED <= ch.status; +  return CH_NOT_APPLIED <= ch.status; } /* Recursively change the modes of the specified FILES (the last entry diff --git a/tests/chmod/ignore-symlink.sh b/tests/chmod/ignore-symlink.sh new file mode 100755 index 000000000..5ce3de816 --- /dev/null +++ b/tests/chmod/ignore-symlink.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Test for proper exit code of chmod on a processed symlink. + +# Copyright (C) 2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ chmod + +mkdir dir || framework_failure_ +touch dir/f || framework_failure_ +ln -s f dir/l || framework_failure_ + +# This operation ignores symlinks but should succeed. +chmod u+w -R dir 2> out || fail=1 + +compare /dev/null out || fail=1 + +Exit $fail diff --git a/tests/local.mk b/tests/local.mk index 228d0e368..b5b893fb7 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -456,6 +456,7 @@ all_tests =					 tests/chmod/c-option.sh			 tests/chmod/equal-x.sh			 tests/chmod/equals.sh				 +  tests/chmod/ignore-symlink.sh			 tests/chmod/inaccessible.sh			 tests/chmod/octal.sh				 tests/chmod/setgid.sh				 </del>