On 2023-09-02 04:18, Bruno Haible wrote:
chmod fails with EACCES, hence per POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html> it's buggy.
Thanks, I reported the bug with chmod, chown, etc. to the linux-cifs mailing list, here:
https://lore.kernel.org/linux-cifs/fe8ab586-c697-583b-650d-3adac64df...@cs.ucla.edu/T/#uI did some testing with fsetxattr and found that it has a similar issue even with ext4; for example, setxattr("/", "a", "b", 1, 0) fails with EACCES. This is not a POSIX violation, since POSIX lacks setxattr. However it's bad form. And it means coreutils needs the attached workaround not just for CIFS, but also for ext4 in some (rare) cases.
I installed the attached workaround on coreutils and am closing the bug report. Thanks again for mentioning it.
From 9cd52bd9993163c2ef8b3d62b757c573fb5320df Mon Sep 17 00:00:00 2001 From: Paul Eggert <egg...@cs.ucla.edu> Date: Sat, 2 Sep 2023 13:27:45 -0700 Subject: [PATCH] cp,mv,install: fix chmod on Linux CIFS This bug occurs only when temporarily setting the mode to the intersection of old and new modes when changing ownership. * src/copy.c (owner_failure_ok): Treat EACCES like EPERM. --- NEWS | 6 +++--- src/copy.c | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 6801832f7..2adea1e11 100644 --- a/NEWS +++ b/NEWS @@ -4,9 +4,9 @@ GNU coreutils NEWS -*- outline -*- ** Bug fixes - cp, mv, install no longer issue spurious "failed to preserve ownership" - diagnostics when copying to GNU/Linux CIFS filesystems. They do - this by working around a Linux CIFS bug. + cp, mv, and install no longer issue spurious diagnostics like "failed + to preserve ownership" when copying to GNU/Linux CIFS file systems. + They do this by working around some Linux CIFS bugs. numfmt options like --suffix no longer have an arbitrary 127-byte limit. [bug introduced with numfmt in coreutils-8.21] diff --git a/src/copy.c b/src/copy.c index 0b3de04f3..9f1f3e85a 100644 --- a/src/copy.c +++ b/src/copy.c @@ -3468,7 +3468,8 @@ chown_failure_ok (struct cp_options const *x) static bool owner_failure_ok (struct cp_options const *x) { - return ((errno == EPERM || errno == EINVAL) && !x->owner_privileges); + return ((errno == EPERM || errno == EINVAL || errno == EACCES) + && !x->owner_privileges); } /* Return the user's umask, caching the result. -- 2.39.2