aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs/zfs_dir.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2017-12-04 11:55:57 -0800
committerGitHub <[email protected]>2017-12-04 11:55:57 -0800
commit7b3407003fde9eb78ea8ce5ce9165cef7e4795f3 (patch)
tree7b842085e89f8772cd3f59dd7d8ca4849f2d78f7 /module/zfs/zfs_dir.c
parent9717fe052b6b7a43e497974817e392dffd8b939b (diff)
Fix NFS sticky bit permission denied error
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 <[email protected]> Reviewed-by: Giuseppe Di Natale <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #6889 Closes #6910
Diffstat (limited to 'module/zfs/zfs_dir.c')
-rw-r--r--module/zfs/zfs_dir.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/module/zfs/zfs_dir.c b/module/zfs/zfs_dir.c
index 1fcc69fd1..c6ee30291 100644
--- a/module/zfs/zfs_dir.c
+++ b/module/zfs/zfs_dir.c
@@ -1126,7 +1126,7 @@ top:
*
* 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.
@@ -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));