2.4.36-stable kernel tree
Revision | c3616f6fc4d1b45866e9ff3f782345b1dbc4ca3f (tree) |
---|---|
Zeit | 2005-06-03 06:04:06 |
Autor | NeilBrown <neilb@cse....> |
Commiter | Marcelo Tosatti |
[PATCH] Don't drop setuid on directories when ownership changed by NFSd
..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
@@ -280,13 +280,17 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
280 | 280 | } |
281 | 281 | |
282 | 282 | /* Revoke setuid/setgid bit on chown/chgrp */ |
283 | - if ((iap->ia_valid & ATTR_UID) && (imode & S_ISUID) | |
284 | - && iap->ia_uid != inode->i_uid) { | |
283 | + if ((iap->ia_valid & ATTR_UID) | |
284 | + && (imode & S_ISUID) | |
285 | + && !S_ISDIR(imode) | |
286 | + && iap->ia_uid != inode->i_uid) { | |
285 | 287 | iap->ia_valid |= ATTR_MODE; |
286 | 288 | iap->ia_mode = imode &= ~S_ISUID; |
287 | 289 | } |
288 | - if ((iap->ia_valid & ATTR_GID) && (imode & S_ISGID) | |
289 | - && iap->ia_gid != inode->i_gid) { | |
290 | + if ((iap->ia_valid & ATTR_GID) | |
291 | + && (imode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP) | |
292 | + && !S_ISDIR(imode) | |
293 | + && iap->ia_gid != inode->i_gid) { | |
290 | 294 | iap->ia_valid |= ATTR_MODE; |
291 | 295 | iap->ia_mode = imode &= ~S_ISGID; |
292 | 296 | } |