]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
media: uvcvideo: Silence memcpy() run-time false positive warnings
authorKees Cook <keescook@chromium.org>
Fri, 6 Jan 2023 06:17:04 +0000 (22:17 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 11 Mar 2023 12:55:33 +0000 (13:55 +0100)
[ Upstream commit b839212988575c701aab4d3d9ca15e44c87e383c ]

The memcpy() in uvc_video_decode_meta() intentionally copies across the
length and flags members and into the trailing buf flexible array.
Split the copy so that the compiler can better reason about (the lack
of) buffer overflows here. Avoid the run-time false positive warning:

  memcpy: detected field-spanning write (size 12) of single field "&meta->length" at drivers/media/usb/uvc/uvc_video.c:1355 (size 1)

Additionally fix a typo in the documentation for struct uvc_meta_buf.

Reported-by: ionut_n2001@yahoo.com
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216810
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/usb/uvc/uvc_video.c
include/uapi/linux/uvcvideo.h

index 53ea225972478d749e92c6753486806b55106262..0d3a3b697b2d83e18e916661d8ded2b58149141a 100644 (file)
@@ -1352,7 +1352,9 @@ static void uvc_video_decode_meta(struct uvc_streaming *stream,
        if (has_scr)
                memcpy(stream->clock.last_scr, scr, 6);
 
-       memcpy(&meta->length, mem, length);
+       meta->length = mem[0];
+       meta->flags  = mem[1];
+       memcpy(meta->buf, &mem[2], length - 2);
        meta_buf->bytesused += length + sizeof(meta->ns) + sizeof(meta->sof);
 
        uvc_dbg(stream->dev, FRAME,
index 8288137387c0d649d45b1d547824ed40652ec8ec..a9d0a64007ba5ab18098cac280ce82a0931b101e 100644 (file)
@@ -86,7 +86,7 @@ struct uvc_xu_control_query {
  * struct. The first two fields are added by the driver, they can be used for
  * clock synchronisation. The rest is an exact copy of a UVC payload header.
  * Only complete objects with complete buffers are included. Therefore it's
- * always sizeof(meta->ts) + sizeof(meta->sof) + meta->length bytes large.
+ * always sizeof(meta->ns) + sizeof(meta->sof) + meta->length bytes large.
  */
 struct uvc_meta_buf {
        __u64 ns;