Commit 332a2e12 authored by Linus Torvalds's avatar Linus Torvalds

vfs: make O_PATH file descriptors usable for 'fchdir()'

We already use them for openat() and friends, but fchdir() also wants to
be able to use O_PATH file descriptors.  This should make it comparable
to the O_SEARCH of Solaris.  In particular, O_PATH allows you to access
(not-quite-open) a directory you don't have read persmission to, only
execute permission.

Noticed during development of multithread support for ksh93.
Reported-by: default avatarольга крыжановская <olga.kryzhanovska@gmail.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: stable@kernel.org    # O_PATH introduced in 3.0+
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent cd6407fe
...@@ -397,10 +397,10 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) ...@@ -397,10 +397,10 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd)
{ {
struct file *file; struct file *file;
struct inode *inode; struct inode *inode;
int error; int error, fput_needed;
error = -EBADF; error = -EBADF;
file = fget(fd); file = fget_raw_light(fd, &fput_needed);
if (!file) if (!file)
goto out; goto out;
...@@ -414,7 +414,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) ...@@ -414,7 +414,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd)
if (!error) if (!error)
set_fs_pwd(current->fs, &file->f_path); set_fs_pwd(current->fs, &file->f_path);
out_putf: out_putf:
fput(file); fput_light(file, fput_needed);
out: out:
return error; return error;
} }
......
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