X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=fs%2Fxattr.c;h=0901bdc2ce24f43d8ca1a62f3cee4c8519e0b21f;hb=bd3c97a7c718bfb9f1e4f31c16c383a5c6f815eb;hp=395635100f77a45784057546b0a0c4a490b03249;hpb=9b6d99f48dfc27d6009e134a5d771eaefd75faac;p=powerpc.git diff --git a/fs/xattr.c b/fs/xattr.c index 395635100f..0901bdc2ce 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -48,14 +48,21 @@ xattr_permission(struct inode *inode, const char *name, int mask) return 0; /* - * The trusted.* namespace can only accessed by a privilegued user. + * The trusted.* namespace can only be accessed by a privileged user. */ if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); + /* In user.* namespace, only regular files and directories can have + * extended attributes. For sticky directories, only the owner and + * privileged user can write attributes. + */ if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { - if (!S_ISREG(inode->i_mode) && - (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) + if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) + return -EPERM; + if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) && + (mask & MAY_WRITE) && (current->fsuid != inode->i_uid) && + !capable(CAP_FOWNER)) return -EPERM; }