Skip to content

Commit 4a892c0

Browse files
author
Al Viro
committed
fuse_dev_ioctl(): switch to fdget()
Reviewed-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 2f31fa0 commit 4a892c0

1 file changed

Lines changed: 21 additions & 20 deletions

File tree

fs/fuse/dev.c

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2257,30 +2257,31 @@ static long fuse_dev_ioctl(struct file *file, unsigned int cmd,
22572257
int res;
22582258
int oldfd;
22592259
struct fuse_dev *fud = NULL;
2260+
struct fd f;
22602261

22612262
switch (cmd) {
22622263
case FUSE_DEV_IOC_CLONE:
2263-
res = -EFAULT;
2264-
if (!get_user(oldfd, (__u32 __user *)arg)) {
2265-
struct file *old = fget(oldfd);
2266-
2267-
res = -EINVAL;
2268-
if (old) {
2269-
/*
2270-
* Check against file->f_op because CUSE
2271-
* uses the same ioctl handler.
2272-
*/
2273-
if (old->f_op == file->f_op)
2274-
fud = fuse_get_dev(old);
2275-
2276-
if (fud) {
2277-
mutex_lock(&fuse_mutex);
2278-
res = fuse_device_clone(fud->fc, file);
2279-
mutex_unlock(&fuse_mutex);
2280-
}
2281-
fput(old);
2282-
}
2264+
if (get_user(oldfd, (__u32 __user *)arg))
2265+
return -EFAULT;
2266+
2267+
f = fdget(oldfd);
2268+
if (!f.file)
2269+
return -EINVAL;
2270+
2271+
/*
2272+
* Check against file->f_op because CUSE
2273+
* uses the same ioctl handler.
2274+
*/
2275+
if (f.file->f_op == file->f_op)
2276+
fud = fuse_get_dev(f.file);
2277+
2278+
res = -EINVAL;
2279+
if (fud) {
2280+
mutex_lock(&fuse_mutex);
2281+
res = fuse_device_clone(fud->fc, file);
2282+
mutex_unlock(&fuse_mutex);
22832283
}
2284+
fdput(f);
22842285
break;
22852286
default:
22862287
res = -ENOTTY;

0 commit comments

Comments
 (0)