aboutsummaryrefslogtreecommitdiff
path: root/hw/i386
diff options
context:
space:
mode:
authorDov Murik <dovmurik@linux.ibm.com>2022-02-22 07:19:05 +0000
committerMichael S. Tsirkin <mst@redhat.com>2022-03-06 05:08:23 -0500
commite5aaeac3554599ad5ca3c8ace38ad5bcd7ae6ff1 (patch)
treeffb5915991ec1f706820101b1175c99f2e0b1e4b /hw/i386
parentb8ffd7d6713fb2703f4b09cea3e62d1c61767107 (diff)
downloadqemu-e5aaeac3554599ad5ca3c8ace38ad5bcd7ae6ff1.zip
qemu-e5aaeac3554599ad5ca3c8ace38ad5bcd7ae6ff1.tar.gz
qemu-e5aaeac3554599ad5ca3c8ace38ad5bcd7ae6ff1.tar.bz2
hw/i386: Improve bounds checking in OVMF table parsing
When pc_system_parse_ovmf_flash() parses the optional GUIDed table in the end of the OVMF flash memory area, the table length field is checked for sizes that are too small, but doesn't error on sizes that are too big (bigger than the flash content itself). Add a check for maximal size of the OVMF table, and add an error report in case the size is invalid. In such a case, an error like this will be displayed during launch: qemu-system-x86_64: OVMF table has invalid size 4047 and the table parsing is skipped. Signed-off-by: Dov Murik <dovmurik@linux.ibm.com> Message-Id: <20220222071906.2632426-2-dovmurik@linux.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'hw/i386')
-rw-r--r--hw/i386/pc_sysfw_ovmf.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/hw/i386/pc_sysfw_ovmf.c b/hw/i386/pc_sysfw_ovmf.c
index f4dd92c..df15c97 100644
--- a/hw/i386/pc_sysfw_ovmf.c
+++ b/hw/i386/pc_sysfw_ovmf.c
@@ -24,6 +24,7 @@
*/
#include "qemu/osdep.h"
+#include "qemu/error-report.h"
#include "hw/i386/pc.h"
#include "cpu.h"
@@ -66,7 +67,13 @@ void pc_system_parse_ovmf_flash(uint8_t *flash_ptr, size_t flash_size)
ptr -= sizeof(uint16_t);
tot_len = le16_to_cpu(*(uint16_t *)ptr) - sizeof(guid) - sizeof(uint16_t);
- if (tot_len <= 0) {
+ if (tot_len < 0 || tot_len > (ptr - flash_ptr)) {
+ error_report("OVMF table has invalid size %d", tot_len);
+ return;
+ }
+
+ if (tot_len == 0) {
+ /* no entries in the OVMF table */
return;
}