usbdevfs: get rid of field-by-field copyin

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro cc1a7c4b 30138384

+19 -29
+19 -29
drivers/usb/core/devio.c
··· 1966 static int get_urb32(struct usbdevfs_urb *kurb, 1967 struct usbdevfs_urb32 __user *uurb) 1968 { 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)) 1981 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 - 1990 return 0; 1991 } 1992 ··· 2192 #ifdef CONFIG_COMPAT 2193 static int proc_ioctl_compat(struct usb_dev_state *ps, compat_uptr_t arg) 2194 { 2195 - struct usbdevfs_ioctl32 __user *uioc; 2196 struct usbdevfs_ioctl ctrl; 2197 - u32 udata; 2198 2199 - uioc = compat_ptr((long)arg); 2200 - if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) || 2201 - __get_user(ctrl.ifno, &uioc->ifno) || 2202 - __get_user(ctrl.ioctl_code, &uioc->ioctl_code) || 2203 - __get_user(udata, &uioc->data)) 2204 return -EFAULT; 2205 - ctrl.data = compat_ptr(udata); 2206 - 2207 return proc_ioctl(ps, &ctrl); 2208 } 2209 #endif
··· 1966 static int get_urb32(struct usbdevfs_urb *kurb, 1967 struct usbdevfs_urb32 __user *uurb) 1968 { 1969 + struct usbdevfs_urb32 urb32; 1970 + if (copy_from_user(&urb32, uurb, sizeof(*uurb))) 1971 return -EFAULT; 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); 1984 return 0; 1985 } 1986 ··· 2198 #ifdef CONFIG_COMPAT 2199 static int proc_ioctl_compat(struct usb_dev_state *ps, compat_uptr_t arg) 2200 { 2201 + struct usbdevfs_ioctl32 ioc32; 2202 struct usbdevfs_ioctl ctrl; 2203 2204 + if (copy_from_user(&ioc32, compat_ptr(arg), sizeof(ioc32))) 2205 return -EFAULT; 2206 + ctrl.ifno = ioc32.ifno; 2207 + ctrl.ioctl_code = ioc32.ioctl_code; 2208 + ctrl.data = compat_ptr(ioc32.data); 2209 return proc_ioctl(ps, &ctrl); 2210 } 2211 #endif