projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[powerpc.git]
/
fs
/
xattr.c
diff --git
a/fs/xattr.c
b/fs/xattr.c
index
3956351
..
3864613
100644
(file)
--- a/
fs/xattr.c
+++ b/
fs/xattr.c
@@
-48,14
+48,21
@@
xattr_permission(struct inode *inode, const char *name, int mask)
return 0;
/*
return 0;
/*
- * The trusted.* namespace can only
accessed by a privilegu
ed user.
+ * The trusted.* namespace can only
be accessed by a privileg
ed user.
*/
if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN))
return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM);
*/
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 (!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;
}
return -EPERM;
}
@@
-261,7
+268,7
@@
sys_fsetxattr(int fd, char __user *name, void __user *value,
f = fget(fd);
if (!f)
return error;
f = fget(fd);
if (!f)
return error;
- dentry = f->f_dentry;
+ dentry = f->f_
path.
dentry;
audit_inode(NULL, dentry->d_inode);
error = setxattr(dentry, name, value, size, flags);
fput(f);
audit_inode(NULL, dentry->d_inode);
error = setxattr(dentry, name, value, size, flags);
fput(f);
@@
-344,7
+351,7
@@
sys_fgetxattr(int fd, char __user *name, void __user *value, size_t size)
f = fget(fd);
if (!f)
return error;
f = fget(fd);
if (!f)
return error;
- error = getxattr(f->f_dentry, name, value, size);
+ error = getxattr(f->f_
path.
dentry, name, value, size);
fput(f);
return error;
}
fput(f);
return error;
}
@@
-416,7
+423,7
@@
sys_flistxattr(int fd, char __user *list, size_t size)
f = fget(fd);
if (!f)
return error;
f = fget(fd);
if (!f)
return error;
- error = listxattr(f->f_dentry, list, size);
+ error = listxattr(f->f_
path.
dentry, list, size);
fput(f);
return error;
}
fput(f);
return error;
}
@@
-477,7
+484,7
@@
sys_fremovexattr(int fd, char __user *name)
f = fget(fd);
if (!f)
return error;
f = fget(fd);
if (!f)
return error;
- dentry = f->f_dentry;
+ dentry = f->f_
path.
dentry;
audit_inode(NULL, dentry->d_inode);
error = removexattr(dentry, name);
fput(f);
audit_inode(NULL, dentry->d_inode);
error = removexattr(dentry, name);
fput(f);