| From e36cf0dae2db1ac64e7196776aeb5fe05c41408f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 23 Dec 2020 14:35:19 +0100 |
| Subject: media: uvcvideo: Allow entities with no pads |
| |
| From: Ricardo Ribalda <ribalda@chromium.org> |
| |
| [ Upstream commit 7532dad6634031d083df7af606fac655b8d08b5c ] |
| |
| Avoid an underflow while calculating the number of inputs for entities |
| with zero pads. |
| |
| Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/usb/uvc/uvc_driver.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c |
| index ddb9eaa11be7..5ad528264135 100644 |
| --- a/drivers/media/usb/uvc/uvc_driver.c |
| +++ b/drivers/media/usb/uvc/uvc_driver.c |
| @@ -1028,7 +1028,10 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id, |
| unsigned int i; |
| |
| extra_size = roundup(extra_size, sizeof(*entity->pads)); |
| - num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1; |
| + if (num_pads) |
| + num_inputs = type & UVC_TERM_OUTPUT ? num_pads : num_pads - 1; |
| + else |
| + num_inputs = 0; |
| size = sizeof(*entity) + extra_size + sizeof(*entity->pads) * num_pads |
| + num_inputs; |
| entity = kzalloc(size, GFP_KERNEL); |
| @@ -1044,7 +1047,7 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id, |
| |
| for (i = 0; i < num_inputs; ++i) |
| entity->pads[i].flags = MEDIA_PAD_FL_SINK; |
| - if (!UVC_ENTITY_IS_OTERM(entity)) |
| + if (!UVC_ENTITY_IS_OTERM(entity) && num_pads) |
| entity->pads[num_pads-1].flags = MEDIA_PAD_FL_SOURCE; |
| |
| entity->bNrInPins = num_inputs; |
| -- |
| 2.30.1 |
| |