]> git.hungrycats.org Git - linux/commitdiff
USB: devio: Properly do access_ok() checks
authorMichael Buesch <mb@bu3sch.de>
Wed, 29 Jul 2009 09:39:03 +0000 (11:39 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 16 Aug 2009 21:27:21 +0000 (14:27 -0700)
commit 18753ebc8a98efe0e8ff6167afb31cef220c8e50 upstream.

access_ok() checks must be done on every part of the userspace structure
that is accessed. If access_ok() on one part of the struct succeeded, it
does not imply it will succeed on other parts of the struct. (Does
depend on the architecture implementation of access_ok()).

This changes the __get_user() users to first check access_ok() on the
data structure.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Cc: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/devio.c

index 1ff88afd5e1a4144394d4ea86633b24005a42713..58375d0d52604249000e6b8caedbcca95393cf21 100644 (file)
@@ -1305,7 +1305,8 @@ static int get_urb32(struct usbdevfs_urb *kurb,
                     struct usbdevfs_urb32 __user *uurb)
 {
        __u32  uptr;
-       if (get_user(kurb->type, &uurb->type) ||
+       if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
+           __get_user(kurb->type, &uurb->type) ||
            __get_user(kurb->endpoint, &uurb->endpoint) ||
            __get_user(kurb->status, &uurb->status) ||
            __get_user(kurb->flags, &uurb->flags) ||
@@ -1522,8 +1523,9 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
        u32 udata;
 
        uioc = compat_ptr((long)arg);
-       if (get_user(ctrl.ifno, &uioc->ifno) ||
-           get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
+       if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
+           __get_user(ctrl.ifno, &uioc->ifno) ||
+           __get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
            __get_user(udata, &uioc->data))
                return -EFAULT;
        ctrl.data = compat_ptr(udata);