summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/boot/efi/vmm.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/boot/efi/vmm.c b/src/boot/efi/vmm.c
index 7d7d0d1382..1d04509a1e 100644
--- a/src/boot/efi/vmm.c
+++ b/src/boot/efi/vmm.c
@@ -213,7 +213,7 @@ static const void *find_smbios_configuration_table(uint64_t *ret_size) {
return NULL;
}
-static const SmbiosHeader *get_smbios_table(uint8_t type, uint64_t *ret_size_left) {
+static const SmbiosHeader *get_smbios_table(uint8_t type, size_t min_size, uint64_t *ret_size_left) {
uint64_t size = 0;
const uint8_t *p = find_smbios_configuration_table(&size);
if (!p)
@@ -233,6 +233,10 @@ static const SmbiosHeader *get_smbios_table(uint8_t type, uint64_t *ret_size_lef
return NULL;
if (header->type == type) {
+ /* Table is smaller than the minimum expected size? Refuse */
+ if (header->length < min_size)
+ return NULL;
+
if (ret_size_left)
*ret_size_left = size;
return header; /* Yay! */
@@ -273,8 +277,8 @@ static const SmbiosHeader *get_smbios_table(uint8_t type, uint64_t *ret_size_lef
static bool smbios_in_hypervisor(void) {
/* Look up BIOS Information (Type 0). */
- const SmbiosTableType0 *type0 = (const SmbiosTableType0 *) get_smbios_table(0, NULL);
- if (!type0 || type0->header.length < sizeof(SmbiosTableType0))
+ const SmbiosTableType0 *type0 = (const SmbiosTableType0 *) get_smbios_table(0, sizeof(SmbiosTableType0), /* left= */ NULL);
+ if (!type0)
return false;
/* Bit 4 of 2nd BIOS characteristics extension bytes indicates virtualization. */
@@ -295,17 +299,18 @@ const char* smbios_find_oem_string(const char *name) {
assert(name);
- const SmbiosTableType11 *type11 = (const SmbiosTableType11 *) get_smbios_table(11, &left);
- if (!type11 || type11->header.length < sizeof(SmbiosTableType11))
+ const SmbiosTableType11 *type11 = (const SmbiosTableType11 *) get_smbios_table(11, sizeof(SmbiosTableType11), &left);
+ if (!type11)
return NULL;
- assert(left >= type11->header.length);
-
const char *s = type11->contents;
+
+ assert(left >= type11->header.length); /* get_smbios_table() already validated this */
left -= type11->header.length;
+ const char *limit = s + left;
- for (const char *p = s; p < s + left; ) {
- const char *e = memchr(p, 0, s + left - p);
+ for (const char *p = s; p < limit; ) {
+ const char *e = memchr(p, 0, limit - p);
if (!e || e == p) /* Double NUL byte means we've reached the end of the OEM strings. */
break;