]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
V4L/DVB: v4l2-ioctl: integer overflow in video_usercopy()
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 5 Jan 2012 05:27:57 +0000 (02:27 -0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 25 Jan 2012 21:53:21 +0000 (13:53 -0800)
commit 6c06108be53ca5e94d8b0e93883d534dd9079646 upstream.

If ctrls->count is too high the multiplication could overflow and
array_size would be lower than expected.  Mauro and Hans Verkuil
suggested that we cap it at 1024.  That comes from the maximum
number of controls with lots of room for expantion.

$ grep V4L2_CID include/linux/videodev2.h | wc -l
211

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/media/video/v4l2-ioctl.c
include/linux/videodev2.h

index 265bfb537fb7b7f55c08fa1697834e9f8cf45ede..d7332c7580644b9299196eb7f41164ea02452f9b 100644 (file)
@@ -414,6 +414,9 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
                p->error_idx = p->count;
                user_ptr = (void __user *)p->controls;
                if (p->count) {
+                       err = -EINVAL;
+                       if (p->count > V4L2_CID_MAX_CTRLS)
+                               goto out_ext_ctrl;
                        ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
                        /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
                        mbuf = kmalloc(ctrls_size, GFP_KERNEL);
@@ -1912,6 +1915,9 @@ long video_ioctl2(struct file *file,
                p->error_idx = p->count;
                user_ptr = (void __user *)p->controls;
                if (p->count) {
+                       err = -EINVAL;
+                       if (p->count > V4L2_CID_MAX_CTRLS)
+                               goto out_ext_ctrl;
                        ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
                        /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is still NULL. */
                        mbuf = kmalloc(ctrls_size, GFP_KERNEL);
index b59e78c57161451049500609fe40b432dc18a7f0..9e2088cb43c202d9fb92481161511e2876a01d92 100644 (file)
@@ -858,6 +858,7 @@ struct v4l2_querymenu {
 #define V4L2_CTRL_FLAG_NEXT_CTRL       0x80000000
 
 /*  User-class control IDs defined by V4L2 */
+#define V4L2_CID_MAX_CTRLS             1024
 #define V4L2_CID_BASE                  (V4L2_CTRL_CLASS_USER | 0x900)
 #define V4L2_CID_USER_BASE             V4L2_CID_BASE
 /*  IDs reserved for driver specific controls */