Skip to content

Commit cc1a7c4

Browse files
author
Al Viro
committed
usbdevfs: get rid of field-by-field copyin
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 3013838 commit cc1a7c4

File tree

1 file changed

+19
-29
lines changed

1 file changed

+19
-29
lines changed

drivers/usb/core/devio.c

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1966,27 +1966,21 @@ static int proc_disconnectsignal_compat(struct usb_dev_state *ps, void __user *a
19661966
static int get_urb32(struct usbdevfs_urb *kurb,
19671967
struct usbdevfs_urb32 __user *uurb)
19681968
{
1969-
__u32 uptr;
1970-
if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
1971-
__get_user(kurb->type, &uurb->type) ||
1972-
__get_user(kurb->endpoint, &uurb->endpoint) ||
1973-
__get_user(kurb->status, &uurb->status) ||
1974-
__get_user(kurb->flags, &uurb->flags) ||
1975-
__get_user(kurb->buffer_length, &uurb->buffer_length) ||
1976-
__get_user(kurb->actual_length, &uurb->actual_length) ||
1977-
__get_user(kurb->start_frame, &uurb->start_frame) ||
1978-
__get_user(kurb->number_of_packets, &uurb->number_of_packets) ||
1979-
__get_user(kurb->error_count, &uurb->error_count) ||
1980-
__get_user(kurb->signr, &uurb->signr))
1969+
struct usbdevfs_urb32 urb32;
1970+
if (copy_from_user(&urb32, uurb, sizeof(*uurb)))
19811971
return -EFAULT;
1982-
1983-
if (__get_user(uptr, &uurb->buffer))
1984-
return -EFAULT;
1985-
kurb->buffer = compat_ptr(uptr);
1986-
if (__get_user(uptr, &uurb->usercontext))
1987-
return -EFAULT;
1988-
kurb->usercontext = compat_ptr(uptr);
1989-
1972+
kurb->type = urb32.type;
1973+
kurb->endpoint = urb32.endpoint;
1974+
kurb->status = urb32.status;
1975+
kurb->flags = urb32.flags;
1976+
kurb->buffer = compat_ptr(urb32.buffer);
1977+
kurb->buffer_length = urb32.buffer_length;
1978+
kurb->actual_length = urb32.actual_length;
1979+
kurb->start_frame = urb32.start_frame;
1980+
kurb->number_of_packets = urb32.number_of_packets;
1981+
kurb->error_count = urb32.error_count;
1982+
kurb->signr = urb32.signr;
1983+
kurb->usercontext = compat_ptr(urb32.usercontext);
19901984
return 0;
19911985
}
19921986

@@ -2198,18 +2192,14 @@ static int proc_ioctl_default(struct usb_dev_state *ps, void __user *arg)
21982192
#ifdef CONFIG_COMPAT
21992193
static int proc_ioctl_compat(struct usb_dev_state *ps, compat_uptr_t arg)
22002194
{
2201-
struct usbdevfs_ioctl32 __user *uioc;
2195+
struct usbdevfs_ioctl32 ioc32;
22022196
struct usbdevfs_ioctl ctrl;
2203-
u32 udata;
22042197

2205-
uioc = compat_ptr((long)arg);
2206-
if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
2207-
__get_user(ctrl.ifno, &uioc->ifno) ||
2208-
__get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
2209-
__get_user(udata, &uioc->data))
2198+
if (copy_from_user(&ioc32, compat_ptr(arg), sizeof(ioc32)))
22102199
return -EFAULT;
2211-
ctrl.data = compat_ptr(udata);
2212-
2200+
ctrl.ifno = ioc32.ifno;
2201+
ctrl.ioctl_code = ioc32.ioctl_code;
2202+
ctrl.data = compat_ptr(ioc32.data);
22132203
return proc_ioctl(ps, &ctrl);
22142204
}
22152205
#endif

0 commit comments

Comments
 (0)