forked from Minki/linux
uvc_v4l2: Simplify compat ioctl implementation
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>
This commit is contained in:
parent
a44323e2a8
commit
f89dec72e9
@ -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)) ||
|
||||
@ -1292,17 +1290,7 @@ 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;
|
||||
}
|
||||
@ -1310,10 +1298,6 @@ static int uvc_v4l2_get_xu_mapping(struct uvc_xu_control_mapping *kp,
|
||||
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))
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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)) ||
|
||||
@ -1361,17 +1333,7 @@ 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;
|
||||
}
|
||||
@ -1379,26 +1341,10 @@ static int uvc_v4l2_get_xu_query(struct uvc_xu_control_query *kp,
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user