mirror of
https://github.com/torvalds/linux.git
synced 2026-06-10 07:32:29 +02:00
uvcvideo: Fix integer overflow in uvc_ioctl_ctrl_map()
commit 806e23e95f upstream.
There is a potential integer overflow in uvc_ioctl_ctrl_map(). When a
large xmap->menu_count is passed from the userspace, the subsequent call
to kmalloc() will allocate a buffer smaller than expected.
map->menu_count and map->menu_info would later be used in a loop (e.g.
in uvc_query_v4l2_ctrl), which leads to out-of-bound access.
The patch checks the ioctl argument and returns -EINVAL for zero or too
large values in xmap->menu_count.
Signed-off-by: Haogang Chen <haogangchen@gmail.com>
[laurent.pinchart@ideasonboard.com Prevent excessive memory consumption]
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
9d3f99878b
commit
087bc746ef
|
|
@ -65,6 +65,15 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *chain,
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* Prevent excessive memory consumption, as well as integer
|
||||
* overflows.
|
||||
*/
|
||||
if (xmap->menu_count == 0 ||
|
||||
xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) {
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
size = xmap->menu_count * sizeof(*map->menu_info);
|
||||
map->menu_info = kmalloc(size, GFP_KERNEL);
|
||||
if (map->menu_info == NULL) {
|
||||
|
|
|
|||
|
|
@ -200,6 +200,7 @@ struct uvc_xu_control {
|
|||
|
||||
/* Maximum allowed number of control mappings per device */
|
||||
#define UVC_MAX_CONTROL_MAPPINGS 1024
|
||||
#define UVC_MAX_CONTROL_MENU_ENTRIES 32
|
||||
|
||||
/* Devices quirks */
|
||||
#define UVC_QUIRK_STATUS_INTERVAL 0x00000001
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user