* [PATCH] block/vhdx-log: Improve sanity checks to avoid OOB accesses with bad images
@ 2026-11-11 15:06 Thomas Huth
2026-11-12 12:52 ` Kevin Wolf
0 siblings, 1 reply; 2+ messages in thread
From: Thomas Huth @ 2026-11-11 15:06 UTC (permalink / raw)
To: Kevin Wolf, qemu-devel; +Cc: Hanna Reitz, qemu-block
The multiplication "hdr->descriptor_count * sizeof(VHDXLogDescriptor)" in
vhdx_log_hdr_is_valid() can overflow on 32-bit systems, so this function
could mark bad images as valid when the truncated result is smaller than
hdr->entry_length. Switch to a division on the right hand side instead to
avoid the overflow problems.
The second problem is in vhdx_log_read_desc(): desc_sectors is a 32-bit
value, thus the multiplication "desc_sectors * VHDX_LOG_SECTOR_SIZE" is
also done with 32 bit arithmetics, and the result is used as "size_t"
parameter for qemu_try_blockalign(), i.e. the parameter here is also
only 32 bits on 32-bit systems. Let's add a sanity check here to avoid
the overflow problem that could lead to trouble later.
Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3860
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
block/vhdx-log.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/block/vhdx-log.c b/block/vhdx-log.c
index 4385a2d4f62..5c20468e1e6 100644
--- a/block/vhdx-log.c
+++ b/block/vhdx-log.c
@@ -246,7 +246,7 @@ static bool vhdx_log_hdr_is_valid(VHDXLogEntries *log, VHDXLogEntryHeader *hdr,
goto exit;
}
- if (hdr->descriptor_count * sizeof(VHDXLogDescriptor) > hdr->entry_length) {
+ if (hdr->descriptor_count > hdr->entry_length / sizeof(VHDXLogDescriptor)) {
goto exit;
}
@@ -360,6 +360,10 @@ vhdx_log_read_desc(BlockDriverState *bs, BDRVVHDXState *s, VHDXLogEntries *log,
}
desc_sectors = vhdx_compute_desc_sectors(hdr.descriptor_count);
+ if (desc_sectors > UINT32_MAX / VHDX_LOG_SECTOR_SIZE) {
+ ret = -EINVAL;
+ goto exit;
+ }
desc_entries = qemu_try_blockalign(bs->file->bs,
desc_sectors * VHDX_LOG_SECTOR_SIZE);
if (desc_entries == NULL) {
--
2.56.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] block/vhdx-log: Improve sanity checks to avoid OOB accesses with bad images
2026-11-11 15:06 [PATCH] block/vhdx-log: Improve sanity checks to avoid OOB accesses with bad images Thomas Huth
@ 2026-11-12 12:52 ` Kevin Wolf
0 siblings, 0 replies; 2+ messages in thread
From: Kevin Wolf @ 2026-11-12 12:52 UTC (permalink / raw)
To: Thomas Huth; +Cc: qemu-devel, Hanna Reitz, qemu-block
Am 11.11.2026 um 16:06 hat Thomas Huth geschrieben:
> The multiplication "hdr->descriptor_count * sizeof(VHDXLogDescriptor)" in
> vhdx_log_hdr_is_valid() can overflow on 32-bit systems, so this function
> could mark bad images as valid when the truncated result is smaller than
> hdr->entry_length. Switch to a division on the right hand side instead to
> avoid the overflow problems.
>
> The second problem is in vhdx_log_read_desc(): desc_sectors is a 32-bit
> value, thus the multiplication "desc_sectors * VHDX_LOG_SECTOR_SIZE" is
> also done with 32 bit arithmetics, and the result is used as "size_t"
> parameter for qemu_try_blockalign(), i.e. the parameter here is also
> only 32 bits on 32-bit systems. Let's add a sanity check here to avoid
> the overflow problem that could lead to trouble later.
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3860
> Signed-off-by: Thomas Huth <thuth@redhat.com>
Thanks, applied to the block branch.
Kevin
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-12 12:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-11 15:06 [PATCH] block/vhdx-log: Improve sanity checks to avoid OOB accesses with bad images Thomas Huth
2026-11-12 12:52 ` Kevin Wolf
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.