Skip to content

Commit

Permalink
uvc_v4l2: Simplify compat ioctl implementation
Browse files Browse the repository at this point in the history
The uvc compat ioctl implementation seems to have copied user data
for no good reason.  Remove a bunch of copies.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
  • Loading branch information
Andy Lutomirski committed Jun 10, 2016
1 parent a44323e commit f89dec7
Showing 1 changed file with 2 additions and 56 deletions.
58 changes: 2 additions & 56 deletions drivers/media/usb/uvc/uvc_v4l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,8 +1274,6 @@ struct uvc_xu_control_mapping32 {
static int uvc_v4l2_get_xu_mapping(struct uvc_xu_control_mapping *kp,
const struct uvc_xu_control_mapping32 __user *up)
{
struct uvc_menu_info __user *umenus;
struct uvc_menu_info __user *kmenus;
compat_caddr_t p;

if (!access_ok(VERIFY_READ, up, sizeof(*up)) ||
Expand All @@ -1292,28 +1290,14 @@ static int uvc_v4l2_get_xu_mapping(struct uvc_xu_control_mapping *kp,

if (__get_user(p, &up->menu_info))
return -EFAULT;
umenus = compat_ptr(p);
if (!access_ok(VERIFY_READ, umenus, kp->menu_count * sizeof(*umenus)))
return -EFAULT;

kmenus = compat_alloc_user_space(kp->menu_count * sizeof(*kmenus));
if (kmenus == NULL)
return -EFAULT;
kp->menu_info = kmenus;

if (copy_in_user(kmenus, umenus, kp->menu_count * sizeof(*umenus)))
return -EFAULT;
kp->menu_info = compat_ptr(p);

return 0;
}

static int uvc_v4l2_put_xu_mapping(const struct uvc_xu_control_mapping *kp,
struct uvc_xu_control_mapping32 __user *up)
{
struct uvc_menu_info __user *umenus;
struct uvc_menu_info __user *kmenus = kp->menu_info;
compat_caddr_t p;

if (!access_ok(VERIFY_WRITE, up, sizeof(*up)) ||
__copy_to_user(up, kp, offsetof(typeof(*up), menu_info)) ||
__put_user(kp->menu_count, &up->menu_count))
Expand All @@ -1322,16 +1306,6 @@ static int uvc_v4l2_put_xu_mapping(const struct uvc_xu_control_mapping *kp,
if (__clear_user(up->reserved, sizeof(up->reserved)))
return -EFAULT;

if (kp->menu_count == 0)
return 0;

if (get_user(p, &up->menu_info))
return -EFAULT;
umenus = compat_ptr(p);

if (copy_in_user(umenus, kmenus, kp->menu_count * sizeof(*umenus)))
return -EFAULT;

return 0;
}

Expand All @@ -1346,8 +1320,6 @@ struct uvc_xu_control_query32 {
static int uvc_v4l2_get_xu_query(struct uvc_xu_control_query *kp,
const struct uvc_xu_control_query32 __user *up)
{
u8 __user *udata;
u8 __user *kdata;
compat_caddr_t p;

if (!access_ok(VERIFY_READ, up, sizeof(*up)) ||
Expand All @@ -1361,44 +1333,18 @@ static int uvc_v4l2_get_xu_query(struct uvc_xu_control_query *kp,

if (__get_user(p, &up->data))
return -EFAULT;
udata = compat_ptr(p);
if (!access_ok(VERIFY_READ, udata, kp->size))
return -EFAULT;

kdata = compat_alloc_user_space(kp->size);
if (kdata == NULL)
return -EFAULT;
kp->data = kdata;

if (copy_in_user(kdata, udata, kp->size))
return -EFAULT;
kp->data = compat_ptr(p);

return 0;
}

static int uvc_v4l2_put_xu_query(const struct uvc_xu_control_query *kp,
struct uvc_xu_control_query32 __user *up)
{
u8 __user *udata;
u8 __user *kdata = kp->data;
compat_caddr_t p;

if (!access_ok(VERIFY_WRITE, up, sizeof(*up)) ||
__copy_to_user(up, kp, offsetof(typeof(*up), data)))
return -EFAULT;

if (kp->size == 0)
return 0;

if (get_user(p, &up->data))
return -EFAULT;
udata = compat_ptr(p);
if (!access_ok(VERIFY_READ, udata, kp->size))
return -EFAULT;

if (copy_in_user(udata, kdata, kp->size))
return -EFAULT;

return 0;
}

Expand Down

0 comments on commit f89dec7

Please sign in to comment.