[Stable-11.1.1 18/42] pc-bios/s390-ccw: fix out-of-bounds read in iso_get_file_size()
Michael Tokarev <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu.stable,gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
From: Joshua Daley <[email protected]> In the dir_rem[level] == 0 case, level is decremented, then a virtio_read() is issued on sec_loc[level]. If level is -1, then the 4 bytes before the static sec_loc array are read, and the virtio_read() is issued on that garbage block number. Guard the call to virtio_read() against the value of level to prevent this. Fixes: 869648e87eeb ("pc-bios/s390-ccw: El Torito 16-bit boot image size field workaround") Cc: [email protected] Signed-off-by: Joshua Daley <[email protected]> Reviewed-by: Christian Borntraeger <[email protected]> Reviewed-by: Matthew Rosato <[email protected]> Reviewed-by: Eric Farman <[email protected]> Link: https://lore.kernel.org/qemu-devel/[email protected] [[email protected]: Fixed typo on Christian's tag, added qemu-stable] Signed-off-by: Eric Farman <[email protected]> (cherry picked from commit a9f1e84c6b8213fb1bfc664b1ffa1a8d975a69b6) Signed-off-by: Michael Tokarev <[email protected]> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 420ee32eff8..ed6e8cbbc78 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -902,7 +902,7 @@ static inline long iso_get_file_size(uint32_t load_rba) if (dir_rem[level] == 0) { /* Nothing remaining */ level--; - if (virtio_read(sec_loc[level], temp)) { + if (level >= 0 && virtio_read(sec_loc[level], temp)) { puts("Failed to read ISO directory"); return -EIO; } -- 2.47.3