CAP_CHOWN relaxes the BSD-style restrictions on chowning a file to a user id other than yourself (a restriction instituted to enforce quotas). CAP_FOWNER relaxes the normal restriction on performing operations on files that belong to someone other than yourself. This patch corrects the implementation of these capabilities. Index: fs/attr.c --- fs/attr.c.prev +++ fs/attr.c Tue Aug 29 18:02:40 2000 @@ -23,18 +23,22 @@ int inode_change_ok(struct inode *inode, /* Make sure a caller can chown. */ - if ((ia_valid & ATTR_UID) && - (current->fsuid != inode->i_uid || - attr->ia_uid != inode->i_uid) && !capable(CAP_CHOWN)) - goto error; + if ((ia_valid & ATTR_UID) && attr->ia_uid != inode->i_uid) { + if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER)) + goto error; + if (current->fsuid != attr->ia_uid && !capable(CAP_CHOWN)) + goto error; + } /* Make sure caller can chgrp. */ - if ((ia_valid & ATTR_GID) && - (!in_group_p(attr->ia_gid) && attr->ia_gid != inode->i_gid) && - !capable(CAP_CHOWN)) - goto error; + if ((ia_valid & ATTR_GID) && attr->ia_gid != inode->i_gid) { + if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER)) + goto error; + if (!in_group_p(attr->ia_gid) && !capable(CAP_CHOWN)) + goto error; + } /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER)) goto error; /* Also check the setgid bit! */ -- Chip Salzenberg - a.k.a. - <[EMAIL PROTECTED]> "I wanted to play hopscotch with the impenetrable mystery of existence, but he stepped in a wormhole and had to go in early." // MST3K - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] Please read the FAQ at http://www.tux.org/lkml/