Use access mode instead of open flags to determine needed permissions
Way back when (in commit 834f2a4a15
, aka
"VFS: Allow the filesystem to return a full file pointer on open intent"
to be exact), Trond changed the open logic to keep track of the original
flags to a file open, in order to pass down the the intent of a dentry
lookup to the low-level filesystem.
However, when doing that reorganization, it changed the meaning of
namei_flags, and thus inadvertently changed the test of access mode for
directories (and RO filesystem) to use the wrong flag. So fix those
test back to use access mode ("acc_mode") rather than the open flag
("flag").
Issue noticed by Bill Roman at Datalight.
Reported-and-tested-by: Bill Roman <bill.roman@datalight.com>
Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d0c4c9d4a2
commit
974a9f0b47
1 changed files with 2 additions and 2 deletions
|
@ -1605,7 +1605,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
|
|||
if (S_ISLNK(inode->i_mode))
|
||||
return -ELOOP;
|
||||
|
||||
if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))
|
||||
if (S_ISDIR(inode->i_mode) && (acc_mode & MAY_WRITE))
|
||||
return -EISDIR;
|
||||
|
||||
/*
|
||||
|
@ -1620,7 +1620,7 @@ int may_open(struct nameidata *nd, int acc_mode, int flag)
|
|||
return -EACCES;
|
||||
|
||||
flag &= ~O_TRUNC;
|
||||
} else if (IS_RDONLY(inode) && (flag & FMODE_WRITE))
|
||||
} else if (IS_RDONLY(inode) && (acc_mode & MAY_WRITE))
|
||||
return -EROFS;
|
||||
|
||||
error = vfs_permission(nd, acc_mode);
|
||||
|
|
Loading…
Reference in a new issue