Cygwin: chmod: don't drop default ACEs from directory ACLs

commit bc444e5aa4 introduced a call to get_posix_access()
with a NULL pointer for the mode_t parameter because the value
is not needed later on... entirely ignoring the fact that the
mode_t bits are checked for the object being a directory.

In turn, the get_posix_access() call never checked for default
ACEs and returned only the standard ACEs.  Thus, every chmod call
on a directory dropped the default ACEs from its permissions, as
well as the default NULL deny-ACE used to store specific bits.
It got also impossible to set the sgid bit on directories.

Fixes: bc444e5aa4 ("Reapply POSIX ACL changes.")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2023-02-09 21:47:15 +01:00
parent 283583c5f2
commit 9afd4c0558
2 changed files with 5 additions and 1 deletions

View File

@ -764,11 +764,12 @@ fhandler_disk_file::fchmod (mode_t mode)
aclent_t *aclp; aclent_t *aclp;
bool standard_acl = false; bool standard_acl = false;
int nentries, idx; int nentries, idx;
mode_t attr = pc.isdir () ? S_IFDIR : 0;
if (!get_file_sd (get_handle (), pc, sd, false)) if (!get_file_sd (get_handle (), pc, sd, false))
{ {
aclp = (aclent_t *) tp.c_get (); aclp = (aclent_t *) tp.c_get ();
if ((nentries = get_posix_access (sd, NULL, &uid, &gid, if ((nentries = get_posix_access (sd, &attr, &uid, &gid,
aclp, MAX_ACL_ENTRIES, aclp, MAX_ACL_ENTRIES,
&standard_acl)) >= 0) &standard_acl)) >= 0)
{ {

View File

@ -9,3 +9,6 @@ Addresses: https://cygwin.com/pipermail/cygwin/2023-January/252928.html
Create directories with correctly umask-filtered default ACEs. Create directories with correctly umask-filtered default ACEs.
Addresses: https://cygwin.com/pipermail/cygwin/2023-February/253037.html Addresses: https://cygwin.com/pipermail/cygwin/2023-February/253037.html
Don't accidentally drop the default ACEs when chmod'ing directories.
Addresses: https://cygwin.com/pipermail/cygwin/2023-February/253037.html