Skip to content

Commit

Permalink
Fix NFS sticky bit permission denied error
Browse files Browse the repository at this point in the history
When zfs_sticky_remove_access() was originally adapted for Linux
a typo was made which altered the intended behavior.  As described
in the block comment, the intended behavior is that permission
should be granted when the entry is a regular file and you have
write access.  That is, S_ISREG should have been used instead of
S_ISDIR.

Restricting permission to regular files made good sense for older
systems where setting the bit on executable files would instruct
the system to save the program's text segment on the swap device.

On modern systems this behavior has been replaced by the sticky
bit acting as a restricted deletion flag and the plain file
restriction has been relaxed.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #6889 
Closes #6910
  • Loading branch information
behlendorf committed Dec 4, 2017
1 parent 9717fe0 commit 7b34070
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions module/zfs/zfs_dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1126,7 +1126,7 @@ zfs_get_xattrdir(znode_t *zp, struct inode **xipp, cred_t *cr, int flags)
*
* you own the directory,
* you own the entry,
* the entry is a plain file and you have write access,
* you have write access to the entry,
* or you are privileged (checked in secpolicy...).
*
* The function returns 0 if remove access is granted.
Expand All @@ -1151,8 +1151,7 @@ zfs_sticky_remove_access(znode_t *zdp, znode_t *zp, cred_t *cr)
cr, ZFS_OWNER);

if ((uid = crgetuid(cr)) == downer || uid == fowner ||
(S_ISDIR(ZTOI(zp)->i_mode) &&
zfs_zaccess(zp, ACE_WRITE_DATA, 0, B_FALSE, cr) == 0))
zfs_zaccess(zp, ACE_WRITE_DATA, 0, B_FALSE, cr) == 0)
return (0);
else
return (secpolicy_vnode_remove(cr));
Expand Down

0 comments on commit 7b34070

Please sign in to comment.