projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] dup3 fix
[firefly-linux-kernel-4.4.55.git]
/
fs
/
xattr.c
diff --git
a/fs/xattr.c
b/fs/xattr.c
index 3acab16154608724f5558458eea5cac2a00b0b5a..468377e665314434fd4f5aa6fe407f50a68096fc 100644
(file)
--- a/
fs/xattr.c
+++ b/
fs/xattr.c
@@
-11,6
+11,7
@@
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/xattr.h>
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/xattr.h>
+#include <linux/mount.h>
#include <linux/namei.h>
#include <linux/security.h>
#include <linux/syscalls.h>
#include <linux/namei.h>
#include <linux/security.h>
#include <linux/syscalls.h>
@@
-32,8
+33,6
@@
xattr_permission(struct inode *inode, const char *name, int mask)
* filesystem or on an immutable / append-only inode.
*/
if (mask & MAY_WRITE) {
* filesystem or on an immutable / append-only inode.
*/
if (mask & MAY_WRITE) {
- if (IS_RDONLY(inode))
- return -EROFS;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
return -EPERM;
}
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
return -EPERM;
}
@@
-64,11
+63,11
@@
xattr_permission(struct inode *inode, const char *name, int mask)
return -EPERM;
}
return -EPERM;
}
- return
permission(inode, mask, NULL
);
+ return
inode_permission(inode, mask
);
}
int
}
int
-vfs_setxattr(struct dentry *dentry, c
har *name,
void *value,
+vfs_setxattr(struct dentry *dentry, c
onst char *name, const
void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
@@
-132,7
+131,7
@@
out_noalloc:
EXPORT_SYMBOL_GPL(xattr_getsecurity);
ssize_t
EXPORT_SYMBOL_GPL(xattr_getsecurity);
ssize_t
-vfs_getxattr(struct dentry *dentry, char *name, void *value, size_t size)
+vfs_getxattr(struct dentry *dentry, c
onst c
har *name, void *value, size_t size)
{
struct inode *inode = dentry->d_inode;
int error;
{
struct inode *inode = dentry->d_inode;
int error;
@@
-188,7
+187,7
@@
vfs_listxattr(struct dentry *d, char *list, size_t size)
EXPORT_SYMBOL_GPL(vfs_listxattr);
int
EXPORT_SYMBOL_GPL(vfs_listxattr);
int
-vfs_removexattr(struct dentry *dentry, char *name)
+vfs_removexattr(struct dentry *dentry, c
onst c
har *name)
{
struct inode *inode = dentry->d_inode;
int error;
{
struct inode *inode = dentry->d_inode;
int error;
@@
-219,7
+218,7
@@
EXPORT_SYMBOL_GPL(vfs_removexattr);
* Extended attribute SET operations
*/
static long
* Extended attribute SET operations
*/
static long
-setxattr(struct dentry *d, c
har __user *name,
void __user *value,
+setxattr(struct dentry *d, c
onst char __user *name, const
void __user *value,
size_t size, int flags)
{
int error;
size_t size, int flags)
{
int error;
@@
-253,37
+252,45
@@
setxattr(struct dentry *d, char __user *name, void __user *value,
}
asmlinkage long
}
asmlinkage long
-sys_setxattr(c
har __user *path, char __user *name, void __user *valu
e,
- size_t size, int flags)
+sys_setxattr(c
onst char __user *pathname, const char __user *nam
e,
+
const void __user *value,
size_t size, int flags)
{
{
- struct
nameidata nd
;
+ struct
path path
;
int error;
int error;
- error = user_path
_walk(path, &nd
);
+ error = user_path
(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = setxattr(nd.path.dentry, name, value, size, flags);
- path_put(&nd.path);
+ error = mnt_want_write(path.mnt);
+ if (!error) {
+ error = setxattr(path.dentry, name, value, size, flags);
+ mnt_drop_write(path.mnt);
+ }
+ path_put(&path);
return error;
}
asmlinkage long
return error;
}
asmlinkage long
-sys_lsetxattr(c
har __user *path, char __user *name, void __user *valu
e,
- size_t size, int flags)
+sys_lsetxattr(c
onst char __user *pathname, const char __user *nam
e,
+
const void __user *value,
size_t size, int flags)
{
{
- struct
nameidata nd
;
+ struct
path path
;
int error;
int error;
- error = user_
path_walk_link(path, &nd
);
+ error = user_
lpath(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = setxattr(nd.path.dentry, name, value, size, flags);
- path_put(&nd.path);
+ error = mnt_want_write(path.mnt);
+ if (!error) {
+ error = setxattr(path.dentry, name, value, size, flags);
+ mnt_drop_write(path.mnt);
+ }
+ path_put(&path);
return error;
}
asmlinkage long
return error;
}
asmlinkage long
-sys_fsetxattr(int fd, c
har __user *name,
void __user *value,
+sys_fsetxattr(int fd, c
onst char __user *name, const
void __user *value,
size_t size, int flags)
{
struct file *f;
size_t size, int flags)
{
struct file *f;
@@
-295,7
+302,11
@@
sys_fsetxattr(int fd, char __user *name, void __user *value,
return error;
dentry = f->f_path.dentry;
audit_inode(NULL, dentry);
return error;
dentry = f->f_path.dentry;
audit_inode(NULL, dentry);
- error = setxattr(dentry, name, value, size, flags);
+ error = mnt_want_write(f->f_path.mnt);
+ if (!error) {
+ error = setxattr(dentry, name, value, size, flags);
+ mnt_drop_write(f->f_path.mnt);
+ }
fput(f);
return error;
}
fput(f);
return error;
}
@@
-304,7
+315,8
@@
sys_fsetxattr(int fd, char __user *name, void __user *value,
* Extended attribute GET operations
*/
static ssize_t
* Extended attribute GET operations
*/
static ssize_t
-getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
+getxattr(struct dentry *d, const char __user *name, void __user *value,
+ size_t size)
{
ssize_t error;
void *kvalue = NULL;
{
ssize_t error;
void *kvalue = NULL;
@@
-338,37
+350,37
@@
getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
}
asmlinkage ssize_t
}
asmlinkage ssize_t
-sys_getxattr(c
har __user *path, char __user *name, void __user *valu
e,
- size_t size)
+sys_getxattr(c
onst char __user *pathname, const char __user *nam
e,
+
void __user *value,
size_t size)
{
{
- struct
nameidata nd
;
+ struct
path path
;
ssize_t error;
ssize_t error;
- error = user_path
_walk(path, &nd
);
+ error = user_path
(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = getxattr(
nd.
path.dentry, name, value, size);
- path_put(&
nd.
path);
+ error = getxattr(path.dentry, name, value, size);
+ path_put(&path);
return error;
}
asmlinkage ssize_t
return error;
}
asmlinkage ssize_t
-sys_lgetxattr(c
har __user *path,
char __user *name, void __user *value,
+sys_lgetxattr(c
onst char __user *pathname, const
char __user *name, void __user *value,
size_t size)
{
size_t size)
{
- struct
nameidata nd
;
+ struct
path path
;
ssize_t error;
ssize_t error;
- error = user_
path_walk_link(path, &nd
);
+ error = user_
lpath(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = getxattr(
nd.
path.dentry, name, value, size);
- path_put(&
nd.
path);
+ error = getxattr(path.dentry, name, value, size);
+ path_put(&path);
return error;
}
asmlinkage ssize_t
return error;
}
asmlinkage ssize_t
-sys_fgetxattr(int fd, char __user *name, void __user *value, size_t size)
+sys_fgetxattr(int fd, c
onst c
har __user *name, void __user *value, size_t size)
{
struct file *f;
ssize_t error = -EBADF;
{
struct file *f;
ssize_t error = -EBADF;
@@
-413,30
+425,30
@@
listxattr(struct dentry *d, char __user *list, size_t size)
}
asmlinkage ssize_t
}
asmlinkage ssize_t
-sys_listxattr(c
har __user *path
, char __user *list, size_t size)
+sys_listxattr(c
onst char __user *pathname
, char __user *list, size_t size)
{
{
- struct
nameidata nd
;
+ struct
path path
;
ssize_t error;
ssize_t error;
- error = user_path
_walk(path, &nd
);
+ error = user_path
(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = listxattr(
nd.
path.dentry, list, size);
- path_put(&
nd.
path);
+ error = listxattr(path.dentry, list, size);
+ path_put(&path);
return error;
}
asmlinkage ssize_t
return error;
}
asmlinkage ssize_t
-sys_llistxattr(c
har __user *path
, char __user *list, size_t size)
+sys_llistxattr(c
onst char __user *pathname
, char __user *list, size_t size)
{
{
- struct
nameidata nd
;
+ struct
path path
;
ssize_t error;
ssize_t error;
- error = user_
path_walk_link(path, &nd
);
+ error = user_
lpath(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = listxattr(
nd.
path.dentry, list, size);
- path_put(&
nd.
path);
+ error = listxattr(path.dentry, list, size);
+ path_put(&path);
return error;
}
return error;
}
@@
-459,7
+471,7
@@
sys_flistxattr(int fd, char __user *list, size_t size)
* Extended attribute REMOVE operations
*/
static long
* Extended attribute REMOVE operations
*/
static long
-removexattr(struct dentry *d, char __user *name)
+removexattr(struct dentry *d, c
onst c
har __user *name)
{
int error;
char kname[XATTR_NAME_MAX + 1];
{
int error;
char kname[XATTR_NAME_MAX + 1];
@@
-474,35
+486,43
@@
removexattr(struct dentry *d, char __user *name)
}
asmlinkage long
}
asmlinkage long
-sys_removexattr(c
har __user *path,
char __user *name)
+sys_removexattr(c
onst char __user *pathname, const
char __user *name)
{
{
- struct
nameidata nd
;
+ struct
path path
;
int error;
int error;
- error = user_path
_walk(path, &nd
);
+ error = user_path
(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = removexattr(nd.path.dentry, name);
- path_put(&nd.path);
+ error = mnt_want_write(path.mnt);
+ if (!error) {
+ error = removexattr(path.dentry, name);
+ mnt_drop_write(path.mnt);
+ }
+ path_put(&path);
return error;
}
asmlinkage long
return error;
}
asmlinkage long
-sys_lremovexattr(c
har __user *path,
char __user *name)
+sys_lremovexattr(c
onst char __user *pathname, const
char __user *name)
{
{
- struct
nameidata nd
;
+ struct
path path
;
int error;
int error;
- error = user_
path_walk_link(path, &nd
);
+ error = user_
lpath(pathname, &path
);
if (error)
return error;
if (error)
return error;
- error = removexattr(nd.path.dentry, name);
- path_put(&nd.path);
+ error = mnt_want_write(path.mnt);
+ if (!error) {
+ error = removexattr(path.dentry, name);
+ mnt_drop_write(path.mnt);
+ }
+ path_put(&path);
return error;
}
asmlinkage long
return error;
}
asmlinkage long
-sys_fremovexattr(int fd, char __user *name)
+sys_fremovexattr(int fd, c
onst c
har __user *name)
{
struct file *f;
struct dentry *dentry;
{
struct file *f;
struct dentry *dentry;
@@
-513,7
+533,11
@@
sys_fremovexattr(int fd, char __user *name)
return error;
dentry = f->f_path.dentry;
audit_inode(NULL, dentry);
return error;
dentry = f->f_path.dentry;
audit_inode(NULL, dentry);
- error = removexattr(dentry, name);
+ error = mnt_want_write(f->f_path.mnt);
+ if (!error) {
+ error = removexattr(dentry, name);
+ mnt_drop_write(f->f_path.mnt);
+ }
fput(f);
return error;
}
fput(f);
return error;
}