NFS: nfs_setattr_update_inode() should clear the suid/sgid bits
When we do a 'chown' or 'chgrp', the server will clear the suid/sgid bits. Ensure that we mirror that in nfs_setattr_update_inode(). Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
63cdd7edfd
commit
1f9f432815
@ -636,8 +636,7 @@ nfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Optimization: if the end result is no change, don't RPC */
|
/* Optimization: if the end result is no change, don't RPC */
|
||||||
attr->ia_valid &= NFS_VALID_ATTRS;
|
if (((attr->ia_valid & NFS_VALID_ATTRS) & ~(ATTR_FILE|ATTR_OPEN)) == 0)
|
||||||
if ((attr->ia_valid & ~(ATTR_FILE|ATTR_OPEN)) == 0)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
trace_nfs_setattr_enter(inode);
|
trace_nfs_setattr_enter(inode);
|
||||||
@ -719,6 +718,13 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
|
|||||||
}
|
}
|
||||||
if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0) {
|
if ((attr->ia_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) != 0) {
|
||||||
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_CTIME;
|
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_CTIME;
|
||||||
|
if ((attr->ia_valid & ATTR_KILL_SUID) != 0 &&
|
||||||
|
inode->i_mode & S_ISUID)
|
||||||
|
inode->i_mode &= ~S_ISUID;
|
||||||
|
if ((attr->ia_valid & ATTR_KILL_SGID) != 0 &&
|
||||||
|
(inode->i_mode & (S_ISGID | S_IXGRP)) ==
|
||||||
|
(S_ISGID | S_IXGRP))
|
||||||
|
inode->i_mode &= ~S_ISGID;
|
||||||
if ((attr->ia_valid & ATTR_MODE) != 0) {
|
if ((attr->ia_valid & ATTR_MODE) != 0) {
|
||||||
int mode = attr->ia_mode & S_IALLUGO;
|
int mode = attr->ia_mode & S_IALLUGO;
|
||||||
mode |= inode->i_mode & ~S_IALLUGO;
|
mode |= inode->i_mode & ~S_IALLUGO;
|
||||||
|
Loading…
Reference in New Issue
Block a user