mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
media: s2255: bound JPEG frame size before copying into the buffer
s2255_fillbuff() memcpy()s vc->jpg_size bytes of a captured JPEG/MJPEG
frame into the vb2 plane. vc->jpg_size is taken verbatim from the
S2255_MARKER_FRAME header the device sends (pdword[4] in save_frame())
and, unlike the frame payload length just above it, is never bounded:
payload = le32_to_cpu(pdword[3]);
if (payload > vc->req_image_size) /* payload is checked ... */
return -EINVAL;
vc->pkt_size = payload;
vc->jpg_size = le32_to_cpu(pdword[4]); /* ... jpg_size is not */
A malicious or malfunctioning device can therefore report a jpg_size
larger than the destination vb2 plane, and the memcpy() writes past it.
jpg_size is a signed int, so a value with the top bit set also turns
into a huge length.
Reject a frame whose jpg_size is negative or exceeds the plane size
before copying it.
Fixes: 38f993ad8b ("V4L/DVB (8125): This driver adds support for the Sensoray 2255 devices.")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
parent
59dc14a6cb
commit
e504cc888f
|
|
@ -612,6 +612,12 @@ static void s2255_fillbuff(struct s2255_vc *vc,
|
|||
break;
|
||||
case V4L2_PIX_FMT_JPEG:
|
||||
case V4L2_PIX_FMT_MJPEG:
|
||||
if (jpgsize < 0 ||
|
||||
jpgsize > vb2_plane_size(&buf->vb.vb2_buf, 0)) {
|
||||
dprintk(dev, 1, "bad JPEG frame size %d\n",
|
||||
jpgsize);
|
||||
break;
|
||||
}
|
||||
vb2_set_plane_payload(&buf->vb.vb2_buf, 0, jpgsize);
|
||||
memcpy(vbuf, tmpbuf, jpgsize);
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user