media: saa7146: fix array overflow in vidioc_s_audio()
authorDan Carpenter <dan.carpenter@oracle.com>
Tue, 17 Nov 2020 07:23:40 +0000 (08:23 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 3 Dec 2020 06:46:34 +0000 (07:46 +0100)
The "a->index" value comes from the user via the ioctl.  The problem is
that the shift can wrap resulting in setting "mxb->cur_audinput" to an
invalid value, which later results in an array overflow.

Fixes: 6680427791c9 ("[media] mxb: fix audio handling")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/pci/saa7146/mxb.c

index 129a1f8..73fc901 100644 (file)
@@ -641,16 +641,17 @@ static int vidioc_s_audio(struct file *file, void *fh, const struct v4l2_audio *
        struct mxb *mxb = (struct mxb *)dev->ext_priv;
 
        DEB_D("VIDIOC_S_AUDIO %d\n", a->index);
-       if (mxb_inputs[mxb->cur_input].audioset & (1 << a->index)) {
-               if (mxb->cur_audinput != a->index) {
-                       mxb->cur_audinput = a->index;
-                       tea6420_route(mxb, a->index);
-                       if (mxb->cur_audinput == 0)
-                               mxb_update_audmode(mxb);
-               }
-               return 0;
+       if (a->index >= 32 ||
+           !(mxb_inputs[mxb->cur_input].audioset & (1 << a->index)))
+               return -EINVAL;
+
+       if (mxb->cur_audinput != a->index) {
+               mxb->cur_audinput = a->index;
+               tea6420_route(mxb, a->index);
+               if (mxb->cur_audinput == 0)
+                       mxb_update_audmode(mxb);
        }
-       return -EINVAL;
+       return 0;
 }
 
 #ifdef CONFIG_VIDEO_ADV_DEBUG