linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Prevent buffer overflow in UVC Gadget setup handler
@ 2022-12-01 12:21 Szymon Heidrich
  2022-12-01 12:28 ` Greg Kroah-Hartman
  2022-12-01 13:49 ` Dan Scally
  0 siblings, 2 replies; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-01 12:21 UTC (permalink / raw)
  To: laurent.pinchart
  Cc: szymon.heidrich, Felipe Balbi, Greg Kroah-Hartman, linux-usb,
	linux-kernel

Setup function uvc_function_setup permits control transfer
requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
data stage handler for OUT transfer uses memcpy to copy req->actual
bytes to uvc_event->data.data array of size 60. This may result
in an overflow of 4 bytes.

Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
---
 drivers/usb/gadget/function/f_uvc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 6e196e061..69c5eb3a3 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
 
 		memset(&v4l2_event, 0, sizeof(v4l2_event));
 		v4l2_event.type = UVC_EVENT_DATA;
-		uvc_event->data.length = req->actual;
-		memcpy(&uvc_event->data.data, req->buf, req->actual);
+		uvc_event->data.length = (req->actual > sizeof(uvc_event->data.data) ?
+			sizeof(uvc_event->data.data) : req->actual);
+		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
 		v4l2_event_queue(&uvc->vdev, &v4l2_event);
 	}
 }
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] Prevent buffer overflow in UVC Gadget setup handler
  2022-12-01 12:21 [PATCH] Prevent buffer overflow in UVC Gadget setup handler Szymon Heidrich
@ 2022-12-01 12:28 ` Greg Kroah-Hartman
  2022-12-01 12:44   ` Szymon Heidrich
  2022-12-01 13:49 ` Dan Scally
  1 sibling, 1 reply; 12+ messages in thread
From: Greg Kroah-Hartman @ 2022-12-01 12:28 UTC (permalink / raw)
  To: Szymon Heidrich; +Cc: laurent.pinchart, Felipe Balbi, linux-usb, linux-kernel

On Thu, Dec 01, 2022 at 01:21:41PM +0100, Szymon Heidrich wrote:
> Setup function uvc_function_setup permits control transfer
> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
> data stage handler for OUT transfer uses memcpy to copy req->actual
> bytes to uvc_event->data.data array of size 60. This may result
> in an overflow of 4 bytes.
> 
> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
> ---
>  drivers/usb/gadget/function/f_uvc.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)

What commit id does this fix?  Is it needed for stable kernels?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Prevent buffer overflow in UVC Gadget setup handler
  2022-12-01 12:28 ` Greg Kroah-Hartman
@ 2022-12-01 12:44   ` Szymon Heidrich
  0 siblings, 0 replies; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-01 12:44 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: laurent.pinchart, Felipe Balbi, linux-usb, linux-kernel

On 01/12/2022 13:28, Greg Kroah-Hartman wrote:
> On Thu, Dec 01, 2022 at 01:21:41PM +0100, Szymon Heidrich wrote:
>> Setup function uvc_function_setup permits control transfer
>> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
>> data stage handler for OUT transfer uses memcpy to copy req->actual
>> bytes to uvc_event->data.data array of size 60. This may result
>> in an overflow of 4 bytes.
>>
>> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
>> ---
>>  drivers/usb/gadget/function/f_uvc.c | 5 +++--
>>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> What commit id does this fix?  Is it needed for stable kernels?
> 
> thanks,
> 
> greg k-h

As far as I understand this would be the original commit so cdda479f15cd13fa50a913ca85129c0437cc7b91.
I guess that it is also needed for stable kernels, yet please correct me if I'm wrong.

Best regards,
Szymon

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Prevent buffer overflow in UVC Gadget setup handler
  2022-12-01 12:21 [PATCH] Prevent buffer overflow in UVC Gadget setup handler Szymon Heidrich
  2022-12-01 12:28 ` Greg Kroah-Hartman
@ 2022-12-01 13:49 ` Dan Scally
  2022-12-01 14:22   ` Szymon Heidrich
  1 sibling, 1 reply; 12+ messages in thread
From: Dan Scally @ 2022-12-01 13:49 UTC (permalink / raw)
  To: Szymon Heidrich, laurent.pinchart
  Cc: Felipe Balbi, Greg Kroah-Hartman, linux-usb, linux-kernel

Hello - thanks for the patch

On 01/12/2022 12:21, Szymon Heidrich wrote:
> Setup function uvc_function_setup


You've written uvc_function_setup here, but the code changes 
uvc_function_ep0_complete.

>   permits control transfer
> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
> data stage handler for OUT transfer uses memcpy to copy req->actual
> bytes to uvc_event->data.data array of size 60. This may result
> in an overflow of 4 bytes.
>
> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>


Good catch

> ---
>   drivers/usb/gadget/function/f_uvc.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
> index 6e196e061..69c5eb3a3 100644
> --- a/drivers/usb/gadget/function/f_uvc.c
> +++ b/drivers/usb/gadget/function/f_uvc.c
> @@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
>   
>   		memset(&v4l2_event, 0, sizeof(v4l2_event));
>   		v4l2_event.type = UVC_EVENT_DATA;
> -		uvc_event->data.length = req->actual;
> -		memcpy(&uvc_event->data.data, req->buf, req->actual);
> +		uvc_event->data.length = (req->actual > sizeof(uvc_event->data.data) ?
> +			sizeof(uvc_event->data.data) : req->actual);


There's a clamp() macro in f_uvc.c, can we use that?

> +		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
>   		v4l2_event_queue(&uvc->vdev, &v4l2_event);
>   	}
>   }

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] Prevent buffer overflow in UVC Gadget setup handler
  2022-12-01 13:49 ` Dan Scally
@ 2022-12-01 14:22   ` Szymon Heidrich
  2022-12-01 15:45     ` [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in " Szymon Heidrich
  0 siblings, 1 reply; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-01 14:22 UTC (permalink / raw)
  To: Dan Scally, laurent.pinchart
  Cc: Felipe Balbi, Greg Kroah-Hartman, linux-usb, linux-kernel

On 01/12/2022 14:49, Dan Scally wrote:
> Hello - thanks for the patch
> 
> On 01/12/2022 12:21, Szymon Heidrich wrote:
>> Setup function uvc_function_setup
> 
> 
> You've written uvc_function_setup here, but the code changes uvc_function_ep0_complete.

Yes, this was intentional as uvc_function_setup prevents handling of control
transfer requests with wLength grater than UVC_MAX_REQUEST_SIZE.
The uvc_function_ep0_complete function handles data phase thus was modified.

> 
>>   permits control transfer
>> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
>> data stage handler for OUT transfer uses memcpy to copy req->actual
>> bytes to uvc_event->data.data array of size 60. This may result
>> in an overflow of 4 bytes.
>>
>> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
> 
> 
> Good catch
> 
>> ---
>>   drivers/usb/gadget/function/f_uvc.c | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
>> index 6e196e061..69c5eb3a3 100644
>> --- a/drivers/usb/gadget/function/f_uvc.c
>> +++ b/drivers/usb/gadget/function/f_uvc.c
>> @@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
>>             memset(&v4l2_event, 0, sizeof(v4l2_event));
>>           v4l2_event.type = UVC_EVENT_DATA;
>> -        uvc_event->data.length = req->actual;
>> -        memcpy(&uvc_event->data.data, req->buf, req->actual);
>> +        uvc_event->data.length = (req->actual > sizeof(uvc_event->data.data) ?
>> +            sizeof(uvc_event->data.data) : req->actual);
> 
> 
> There's a clamp() macro in f_uvc.c, can we use that?
> 
>> +        memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
>>           v4l2_event_queue(&uvc->vdev, &v4l2_event);
>>       }
>>   }

If it is more appropriate I will use min_t(unsigned int, req->actual, sizeof(uvc_event->data.data)).


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-01 14:22   ` Szymon Heidrich
@ 2022-12-01 15:45     ` Szymon Heidrich
  2022-12-01 17:54       ` Greg Kroah-Hartman
  0 siblings, 1 reply; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-01 15:45 UTC (permalink / raw)
  To: dan.scally, laurent.pinchart
  Cc: szymon.heidrich, Felipe Balbi, Greg Kroah-Hartman, linux-usb,
	linux-kernel

Setup function uvc_function_setup permits control transfer
requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
data stage handler for OUT transfer uses memcpy to copy req->actual
bytes to uvc_event->data.data array of size 60. This may result
in an overflow of 4 bytes.

Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
---
 drivers/usb/gadget/function/f_uvc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 6e196e061..4419b7972 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
 
 		memset(&v4l2_event, 0, sizeof(v4l2_event));
 		v4l2_event.type = UVC_EVENT_DATA;
-		uvc_event->data.length = req->actual;
-		memcpy(&uvc_event->data.data, req->buf, req->actual);
+		uvc_event->data.length = min_t(unsigned int, req->actual,
+			sizeof(uvc_event->data.data));
+		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
 		v4l2_event_queue(&uvc->vdev, &v4l2_event);
 	}
 }
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-01 15:45     ` [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in " Szymon Heidrich
@ 2022-12-01 17:54       ` Greg Kroah-Hartman
  2022-12-01 19:11         ` Szymon Heidrich
  0 siblings, 1 reply; 12+ messages in thread
From: Greg Kroah-Hartman @ 2022-12-01 17:54 UTC (permalink / raw)
  To: Szymon Heidrich
  Cc: dan.scally, laurent.pinchart, Felipe Balbi, linux-usb, linux-kernel

On Thu, Dec 01, 2022 at 04:45:46PM +0100, Szymon Heidrich wrote:
> Setup function uvc_function_setup permits control transfer
> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
> data stage handler for OUT transfer uses memcpy to copy req->actual
> bytes to uvc_event->data.data array of size 60. This may result
> in an overflow of 4 bytes.
> 
> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
> ---
>  drivers/usb/gadget/function/f_uvc.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
> index 6e196e061..4419b7972 100644
> --- a/drivers/usb/gadget/function/f_uvc.c
> +++ b/drivers/usb/gadget/function/f_uvc.c
> @@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
>  
>  		memset(&v4l2_event, 0, sizeof(v4l2_event));
>  		v4l2_event.type = UVC_EVENT_DATA;
> -		uvc_event->data.length = req->actual;
> -		memcpy(&uvc_event->data.data, req->buf, req->actual);
> +		uvc_event->data.length = min_t(unsigned int, req->actual,
> +			sizeof(uvc_event->data.data));
> +		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
>  		v4l2_event_queue(&uvc->vdev, &v4l2_event);
>  	}
>  }
> -- 
> 2.38.1
> 

Hi,

This is the friendly patch-bot of Greg Kroah-Hartman.  You have sent him
a patch that has triggered this response.  He used to manually respond
to these common problems, but in order to save his sanity (he kept
writing the same thing over and over, yet to different people), I was
created.  Hopefully you will not take offence and will fix the problem
in your patch and resubmit it so that it can be accepted into the Linux
kernel tree.

You are receiving this message because of the following common error(s)
as indicated below:

- This looks like a new version of a previously submitted patch, but you
  did not list below the --- line any changes from the previous version.
  Please read the section entitled "The canonical patch format" in the
  kernel file, Documentation/SubmittingPatches for what needs to be done
  here to properly describe this.

If you wish to discuss this problem further, or you have questions about
how to resolve this issue, please feel free to respond to this email and
Greg will reply once he has dug out from the pending patches received
from other developers.

thanks,

greg k-h's patch email bot

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-01 17:54       ` Greg Kroah-Hartman
@ 2022-12-01 19:11         ` Szymon Heidrich
  2022-12-06 11:33           ` Dan Scally
  0 siblings, 1 reply; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-01 19:11 UTC (permalink / raw)
  To: dan.scally, laurent.pinchart
  Cc: szymon.heidrich, Felipe Balbi, Greg Kroah-Hartman, linux-usb,
	linux-kernel

Setup function uvc_function_setup permits control transfer
requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
data stage handler for OUT transfer uses memcpy to copy req->actual
bytes to uvc_event->data.data array of size 60. This may result
in an overflow of 4 bytes.

Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
---
V1 -> V2: Corrected commit message and changed ?: in favor of min_t

 drivers/usb/gadget/function/f_uvc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 6e196e061..4419b7972 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
 
 		memset(&v4l2_event, 0, sizeof(v4l2_event));
 		v4l2_event.type = UVC_EVENT_DATA;
-		uvc_event->data.length = req->actual;
-		memcpy(&uvc_event->data.data, req->buf, req->actual);
+		uvc_event->data.length = min_t(unsigned int, req->actual,
+			sizeof(uvc_event->data.data));
+		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
 		v4l2_event_queue(&uvc->vdev, &v4l2_event);
 	}
 }
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-01 19:11         ` Szymon Heidrich
@ 2022-12-06 11:33           ` Dan Scally
  2022-12-06 14:13             ` [PATCH v3] " Szymon Heidrich
  0 siblings, 1 reply; 12+ messages in thread
From: Dan Scally @ 2022-12-06 11:33 UTC (permalink / raw)
  To: Szymon Heidrich, laurent.pinchart
  Cc: Felipe Balbi, Greg Kroah-Hartman, linux-usb, linux-kernel

Hi Szymon

On 01/12/2022 19:11, Szymon Heidrich wrote:
> Setup function uvc_function_setuppermits control transfer
> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
> data stage handler for OUT transfer uses memcpy to copy req->actual
> bytes to uvc_event->data.data array of size 60. This may result
> in an overflow of 4 bytes.
>
> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>


Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>


This probably needs to be tagged with:


Fixes: cdda479f15cd ("USB gadget: video class function driver")

> ---
> V1 -> V2: Corrected commit message and changed ?: in favor of min_t
>
>   drivers/usb/gadget/function/f_uvc.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
> index 6e196e061..4419b7972 100644
> --- a/drivers/usb/gadget/function/f_uvc.c
> +++ b/drivers/usb/gadget/function/f_uvc.c
> @@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
>   
>   		memset(&v4l2_event, 0, sizeof(v4l2_event));
>   		v4l2_event.type = UVC_EVENT_DATA;
> -		uvc_event->data.length = req->actual;
> -		memcpy(&uvc_event->data.data, req->buf, req->actual);
> +		uvc_event->data.length = min_t(unsigned int, req->actual,
> +			sizeof(uvc_event->data.data));
> +		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
>   		v4l2_event_queue(&uvc->vdev, &v4l2_event);
>   	}
>   }

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-06 11:33           ` Dan Scally
@ 2022-12-06 14:13             ` Szymon Heidrich
  2022-12-06 21:21               ` Laurent Pinchart
  0 siblings, 1 reply; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-06 14:13 UTC (permalink / raw)
  To: dan.scally, laurent.pinchart
  Cc: szymon.heidrich, Felipe Balbi, Greg Kroah-Hartman, linux-usb,
	linux-kernel

Setup function uvc_function_setup permits control transfer
requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
data stage handler for OUT transfer uses memcpy to copy req->actual
bytes to uvc_event->data.data array of size 60. This may result
in an overflow of 4 bytes.

Fixes: cdda479f15cd ("USB gadget: video class function driver")
Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
---
V1 -> V2: Corrected commit message and changed ?: in favor of min_t
V2 -> V3: Added fixes tag

 drivers/usb/gadget/function/f_uvc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 6e196e061..4419b7972 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
 
 		memset(&v4l2_event, 0, sizeof(v4l2_event));
 		v4l2_event.type = UVC_EVENT_DATA;
-		uvc_event->data.length = req->actual;
-		memcpy(&uvc_event->data.data, req->buf, req->actual);
+		uvc_event->data.length = min_t(unsigned int, req->actual,
+			sizeof(uvc_event->data.data));
+		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
 		v4l2_event_queue(&uvc->vdev, &v4l2_event);
 	}
 }
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v3] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-06 14:13             ` [PATCH v3] " Szymon Heidrich
@ 2022-12-06 21:21               ` Laurent Pinchart
  2022-12-06 21:43                 ` Szymon Heidrich
  0 siblings, 1 reply; 12+ messages in thread
From: Laurent Pinchart @ 2022-12-06 21:21 UTC (permalink / raw)
  To: Szymon Heidrich
  Cc: dan.scally, Felipe Balbi, Greg Kroah-Hartman, linux-usb, linux-kernel

Hi Szymon,

Thank you for the patch.

On Tue, Dec 06, 2022 at 03:13:01PM +0100, Szymon Heidrich wrote:
> Setup function uvc_function_setup permits control transfer
> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
> data stage handler for OUT transfer uses memcpy to copy req->actual
> bytes to uvc_event->data.data array of size 60. This may result
> in an overflow of 4 bytes.
> 
> Fixes: cdda479f15cd ("USB gadget: video class function driver")
> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>

Good catch.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
> V1 -> V2: Corrected commit message and changed ?: in favor of min_t
> V2 -> V3: Added fixes tag
> 
>  drivers/usb/gadget/function/f_uvc.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
> index 6e196e061..4419b7972 100644
> --- a/drivers/usb/gadget/function/f_uvc.c
> +++ b/drivers/usb/gadget/function/f_uvc.c
> @@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
>  
>  		memset(&v4l2_event, 0, sizeof(v4l2_event));
>  		v4l2_event.type = UVC_EVENT_DATA;
> -		uvc_event->data.length = req->actual;
> -		memcpy(&uvc_event->data.data, req->buf, req->actual);
> +		uvc_event->data.length = min_t(unsigned int, req->actual,
> +			sizeof(uvc_event->data.data));
> +		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
>  		v4l2_event_queue(&uvc->vdev, &v4l2_event);
>  	}
>  }

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3] usb: gadget: uvc: Prevent buffer overflow in setup handler
  2022-12-06 21:21               ` Laurent Pinchart
@ 2022-12-06 21:43                 ` Szymon Heidrich
  0 siblings, 0 replies; 12+ messages in thread
From: Szymon Heidrich @ 2022-12-06 21:43 UTC (permalink / raw)
  To: dan.scally, Laurent Pinchart
  Cc: Felipe Balbi, Greg Kroah-Hartman, linux-usb, linux-kernel

On 06/12/2022 22:21, Laurent Pinchart wrote:
> Hi Szymon,
> 
> Thank you for the patch.
> 
> On Tue, Dec 06, 2022 at 03:13:01PM +0100, Szymon Heidrich wrote:
>> Setup function uvc_function_setup permits control transfer
>> requests with up to 64 bytes of payload (UVC_MAX_REQUEST_SIZE),
>> data stage handler for OUT transfer uses memcpy to copy req->actual
>> bytes to uvc_event->data.data array of size 60. This may result
>> in an overflow of 4 bytes.
>>
>> Fixes: cdda479f15cd ("USB gadget: video class function driver")
>> Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
> 
> Good catch.
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
>> ---
>> V1 -> V2: Corrected commit message and changed ?: in favor of min_t
>> V2 -> V3: Added fixes tag
>>
>>  drivers/usb/gadget/function/f_uvc.c | 5 +++--
>>  1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
>> index 6e196e061..4419b7972 100644
>> --- a/drivers/usb/gadget/function/f_uvc.c
>> +++ b/drivers/usb/gadget/function/f_uvc.c
>> @@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct usb_request *req)
>>  
>>  		memset(&v4l2_event, 0, sizeof(v4l2_event));
>>  		v4l2_event.type = UVC_EVENT_DATA;
>> -		uvc_event->data.length = req->actual;
>> -		memcpy(&uvc_event->data.data, req->buf, req->actual);
>> +		uvc_event->data.length = min_t(unsigned int, req->actual,
>> +			sizeof(uvc_event->data.data));
>> +		memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
>>  		v4l2_event_queue(&uvc->vdev, &v4l2_event);
>>  	}
>>  }
> 

Hello Dan and Laurent,

Thank you very much for your time, review and accurate remarks.

Best regards,
Szymon

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2022-12-06 21:43 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-01 12:21 [PATCH] Prevent buffer overflow in UVC Gadget setup handler Szymon Heidrich
2022-12-01 12:28 ` Greg Kroah-Hartman
2022-12-01 12:44   ` Szymon Heidrich
2022-12-01 13:49 ` Dan Scally
2022-12-01 14:22   ` Szymon Heidrich
2022-12-01 15:45     ` [PATCH v2] usb: gadget: uvc: Prevent buffer overflow in " Szymon Heidrich
2022-12-01 17:54       ` Greg Kroah-Hartman
2022-12-01 19:11         ` Szymon Heidrich
2022-12-06 11:33           ` Dan Scally
2022-12-06 14:13             ` [PATCH v3] " Szymon Heidrich
2022-12-06 21:21               ` Laurent Pinchart
2022-12-06 21:43                 ` Szymon Heidrich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).