}
/* 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;
}