OSDN Git Service

[PATCH] Don't drop setuid on directories when ownership changed by NFSd
authorNeilBrown <neilb@cse.unsw.edu.au>
Wed, 1 Jun 2005 01:20:26 +0000 (11:20 +1000)
committerMarcelo Tosatti <marcelo.tosatti@cyclades.com>
Thu, 2 Jun 2005 21:04:06 +0000 (18:04 -0300)
..as setuid means something totally different on directories.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
diff ./fs/nfsd/vfs.c~current~ ./fs/nfsd/vfs.c

fs/nfsd/vfs.c

index 59d4b91..c30de55 100644 (file)
@@ -280,13 +280,17 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
        }
 
        /* Revoke setuid/setgid bit on chown/chgrp */
-       if ((iap->ia_valid & ATTR_UID) && (imode & S_ISUID)
-        && iap->ia_uid != inode->i_uid) {
+       if ((iap->ia_valid & ATTR_UID)
+           && (imode & S_ISUID)
+           && !S_ISDIR(imode)
+           && iap->ia_uid != inode->i_uid) {
                iap->ia_valid |= ATTR_MODE;
                iap->ia_mode = imode &= ~S_ISUID;
        }
-       if ((iap->ia_valid & ATTR_GID) && (imode & S_ISGID)
-        && iap->ia_gid != inode->i_gid) {
+       if ((iap->ia_valid & ATTR_GID)
+           && (imode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)
+           && !S_ISDIR(imode)
+           && iap->ia_gid != inode->i_gid) {
                iap->ia_valid |= ATTR_MODE;
                iap->ia_mode = imode &= ~S_ISGID;
        }