| From e71a86f003dc08c5196f29dc9e3f42a29804e977 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 17 Nov 2020 08:23:40 +0100 |
| Subject: media: saa7146: fix array overflow in vidioc_s_audio() |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| [ Upstream commit 8e4d86e241cf035d6d3467cd346e7ce490681937 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/pci/saa7146/mxb.c | 19 ++++++++++--------- |
| 1 file changed, 10 insertions(+), 9 deletions(-) |
| |
| diff --git a/drivers/media/pci/saa7146/mxb.c b/drivers/media/pci/saa7146/mxb.c |
| index e6a71c17566d2..952ea250feda0 100644 |
| --- a/drivers/media/pci/saa7146/mxb.c |
| +++ b/drivers/media/pci/saa7146/mxb.c |
| @@ -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 |
| -- |
| 2.27.0 |
| |