Commit 62fb4a15 authored by Al Viro's avatar Al Viro

don't carry MAY_OPEN in op->acc_mode

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b40ef869
...@@ -119,7 +119,7 @@ SYSCALL_DEFINE1(uselib, const char __user *, library) ...@@ -119,7 +119,7 @@ SYSCALL_DEFINE1(uselib, const char __user *, library)
int error = PTR_ERR(tmp); int error = PTR_ERR(tmp);
static const struct open_flags uselib_flags = { static const struct open_flags uselib_flags = {
.open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC,
.acc_mode = MAY_READ | MAY_EXEC | MAY_OPEN, .acc_mode = MAY_READ | MAY_EXEC,
.intent = LOOKUP_OPEN, .intent = LOOKUP_OPEN,
.lookup_flags = LOOKUP_FOLLOW, .lookup_flags = LOOKUP_FOLLOW,
}; };
...@@ -763,7 +763,7 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) ...@@ -763,7 +763,7 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags)
int err; int err;
struct open_flags open_exec_flags = { struct open_flags open_exec_flags = {
.open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC,
.acc_mode = MAY_EXEC | MAY_OPEN, .acc_mode = MAY_EXEC,
.intent = LOOKUP_OPEN, .intent = LOOKUP_OPEN,
.lookup_flags = LOOKUP_FOLLOW, .lookup_flags = LOOKUP_FOLLOW,
}; };
......
...@@ -2663,10 +2663,6 @@ static int may_open(struct path *path, int acc_mode, int flag) ...@@ -2663,10 +2663,6 @@ static int may_open(struct path *path, int acc_mode, int flag)
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
int error; int error;
/* O_PATH? */
if (!acc_mode)
return 0;
if (!inode) if (!inode)
return -ENOENT; return -ENOENT;
...@@ -2688,7 +2684,7 @@ static int may_open(struct path *path, int acc_mode, int flag) ...@@ -2688,7 +2684,7 @@ static int may_open(struct path *path, int acc_mode, int flag)
break; break;
} }
error = inode_permission(inode, acc_mode); error = inode_permission(inode, MAY_OPEN | acc_mode);
if (error) if (error)
return error; return error;
...@@ -2880,7 +2876,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, ...@@ -2880,7 +2876,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
if (*opened & FILE_CREATED) { if (*opened & FILE_CREATED) {
WARN_ON(!(open_flag & O_CREAT)); WARN_ON(!(open_flag & O_CREAT));
fsnotify_create(dir, dentry); fsnotify_create(dir, dentry);
acc_mode = MAY_OPEN; acc_mode = 0;
} }
error = may_open(&file->f_path, acc_mode, open_flag); error = may_open(&file->f_path, acc_mode, open_flag);
if (error) if (error)
...@@ -3093,7 +3089,7 @@ static int do_last(struct nameidata *nd, ...@@ -3093,7 +3089,7 @@ static int do_last(struct nameidata *nd,
/* Don't check for write permission, don't truncate */ /* Don't check for write permission, don't truncate */
open_flag &= ~O_TRUNC; open_flag &= ~O_TRUNC;
will_truncate = false; will_truncate = false;
acc_mode = MAY_OPEN; acc_mode = 0;
path_to_nameidata(&path, nd); path_to_nameidata(&path, nd);
goto finish_open_created; goto finish_open_created;
} }
...@@ -3177,10 +3173,11 @@ static int do_last(struct nameidata *nd, ...@@ -3177,10 +3173,11 @@ static int do_last(struct nameidata *nd,
got_write = true; got_write = true;
} }
finish_open_created: finish_open_created:
error = may_open(&nd->path, acc_mode, open_flag); if (likely(!(open_flag & O_PATH))) {
if (error) error = may_open(&nd->path, acc_mode, open_flag);
goto out; if (error)
goto out;
}
BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */ BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */
error = vfs_open(&nd->path, file, current_cred()); error = vfs_open(&nd->path, file, current_cred());
if (!error) { if (!error) {
...@@ -3267,7 +3264,7 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags, ...@@ -3267,7 +3264,7 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags,
goto out2; goto out2;
audit_inode(nd->name, child, 0); audit_inode(nd->name, child, 0);
/* Don't check for other permissions, the inode was just created */ /* Don't check for other permissions, the inode was just created */
error = may_open(&path, MAY_OPEN, op->open_flag); error = may_open(&path, 0, op->open_flag);
if (error) if (error)
goto out2; goto out2;
file->f_path.mnt = path.mnt; file->f_path.mnt = path.mnt;
......
...@@ -887,7 +887,7 @@ EXPORT_SYMBOL(dentry_open); ...@@ -887,7 +887,7 @@ EXPORT_SYMBOL(dentry_open);
static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op)
{ {
int lookup_flags = 0; int lookup_flags = 0;
int acc_mode; int acc_mode = ACC_MODE(flags);
if (flags & (O_CREAT | __O_TMPFILE)) if (flags & (O_CREAT | __O_TMPFILE))
op->mode = (mode & S_IALLUGO) | S_IFREG; op->mode = (mode & S_IALLUGO) | S_IFREG;
...@@ -909,7 +909,6 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o ...@@ -909,7 +909,6 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
if (flags & __O_TMPFILE) { if (flags & __O_TMPFILE) {
if ((flags & O_TMPFILE_MASK) != O_TMPFILE) if ((flags & O_TMPFILE_MASK) != O_TMPFILE)
return -EINVAL; return -EINVAL;
acc_mode = MAY_OPEN | ACC_MODE(flags);
if (!(acc_mode & MAY_WRITE)) if (!(acc_mode & MAY_WRITE))
return -EINVAL; return -EINVAL;
} else if (flags & O_PATH) { } else if (flags & O_PATH) {
...@@ -919,8 +918,6 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o ...@@ -919,8 +918,6 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
*/ */
flags &= O_DIRECTORY | O_NOFOLLOW | O_PATH; flags &= O_DIRECTORY | O_NOFOLLOW | O_PATH;
acc_mode = 0; acc_mode = 0;
} else {
acc_mode = MAY_OPEN | ACC_MODE(flags);
} }
op->open_flag = flags; op->open_flag = flags;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment