Commit 8cd943eb authored by Maxim Giryaev's avatar Maxim Giryaev Committed by Chris Wright

[PATCH] lost fput in 32bit ioctl on x86-64

This patch adds lost fput in 32bit tiocgdev ioctl on x86-64

I believe this is a security issues, since user can fget() file as
many times as he wants to. So file refcounter can be overlapped and
first fput() will free resources though there will be still structures
pointing to the file, mnt, dentry etc.  Also fput() sets f_dentry and
f_vfsmnt to NULL, so other file users will OOPS.

The oops can be done under files_lock and others, so this is really
exploitable DoS on SMP. Didn't checked it on practice actually.

(chrisw: Update to use fget_light/fput_light)
Signed-Off-By: default avatarKirill Korotaev <dev@sw.ru>
Signed-Off-By: default avatarMaxim Giryaev <gem@sw.ru>
Signed-off-by: default avatarChris Wright <chrisw@osdl.org>
parent 05dbb1e5
......@@ -24,17 +24,26 @@
static int tiocgdev(unsigned fd, unsigned cmd, unsigned int __user *ptr)
{
struct file *file = fget(fd);
struct file *file;
struct tty_struct *real_tty;
int fput_needed, ret;
file = fget_light(fd, &fput_needed);
if (!file)
return -EBADF;
ret = -EINVAL;
if (file->f_op->ioctl != tty_ioctl)
return -EINVAL;
goto out;
real_tty = (struct tty_struct *)file->private_data;
if (!real_tty)
return -EINVAL;
return put_user(new_encode_dev(tty_devnum(real_tty)), ptr);
goto out;
ret = put_user(new_encode_dev(tty_devnum(real_tty)), ptr);
out:
fput_light(file, fput_needed);
return ret;
}
#define RTC_IRQP_READ32 _IOR('p', 0x0b, unsigned int) /* Read IRQ rate */
......
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