mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
drm/virtio: bound EDID block reads to the response buffer
virtio_get_edid_block() validates the read offset only against the
device-supplied resp->size field, never against the fixed-size resp->edid
array. The EDID block index is driven by the device-supplied extension
count, so a malicious virtio-gpu backend can advertise a large size
together with a high block count and read far past the array into adjacent
kernel memory, which is then surfaced in the parsed EDID (an out-of-bounds
read / info leak).
Also reject any read whose end exceeds the size of the edid array.
Conforming EDID responses stay within the array and are unaffected.
Fixes: b4b01b4995 ("drm/virtio: add edid support")
Cc: stable@vger.kernel.org
Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Link: https://patch.msgid.link/20260620-b4-disp-22bba7bf-v1-1-b95924cee742@proton.me
This commit is contained in:
parent
64ace85a72
commit
4e1a53892b
|
|
@ -897,7 +897,8 @@ static int virtio_get_edid_block(void *data, u8 *buf,
|
|||
struct virtio_gpu_resp_edid *resp = data;
|
||||
size_t start = block * EDID_LENGTH;
|
||||
|
||||
if (start + len > le32_to_cpu(resp->size))
|
||||
if (start + len > le32_to_cpu(resp->size) ||
|
||||
start + len > sizeof(resp->edid))
|
||||
return -EINVAL;
|
||||
memcpy(buf, resp->edid + start, len);
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user