mirror of https://gitee.com/openkylin/linux.git
vfs: Fix O_NOFOLLOW behavior for paths with trailing slashes
According to specification mkdir d; ln -s d a; open("a/", O_NOFOLLOW | O_RDONLY) should return success but currently it returns ELOOP. This is a regression caused by path lookup cleanup patch series. Fix the code to ignore O_NOFOLLOW in case the provided path has trailing slashes. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Reported-by: Marius Tolzmann <tolzmann@molgen.mpg.de> Acked-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
fc8e38f142
commit
002baeecf5
|
@ -1641,7 +1641,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
|
|||
if (nd->last.name[nd->last.len]) {
|
||||
if (open_flag & O_CREAT)
|
||||
goto exit;
|
||||
nd->flags |= LOOKUP_DIRECTORY;
|
||||
nd->flags |= LOOKUP_DIRECTORY | LOOKUP_FOLLOW;
|
||||
}
|
||||
|
||||
/* just plain open? */
|
||||
|
@ -1830,6 +1830,8 @@ struct file *do_filp_open(int dfd, const char *pathname,
|
|||
}
|
||||
if (open_flag & O_DIRECTORY)
|
||||
nd.flags |= LOOKUP_DIRECTORY;
|
||||
if (!(open_flag & O_NOFOLLOW))
|
||||
nd.flags |= LOOKUP_FOLLOW;
|
||||
filp = do_last(&nd, &path, open_flag, acc_mode, mode, pathname);
|
||||
while (unlikely(!filp)) { /* trailing symlink */
|
||||
struct path holder;
|
||||
|
@ -1837,7 +1839,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
|
|||
void *cookie;
|
||||
error = -ELOOP;
|
||||
/* S_ISDIR part is a temporary automount kludge */
|
||||
if ((open_flag & O_NOFOLLOW) && !S_ISDIR(inode->i_mode))
|
||||
if (!(nd.flags & LOOKUP_FOLLOW) && !S_ISDIR(inode->i_mode))
|
||||
goto exit_dput;
|
||||
if (count++ == 32)
|
||||
goto exit_dput;
|
||||
|
|
Loading…
Reference in New Issue