|
@@ -365,6 +365,13 @@ static void smbios_register_config(void)
|
|
|
|
|
|
opts_init(smbios_register_config);
|
|
|
|
|
|
+/*
|
|
|
+ * The SMBIOS 2.1 "structure table length" field in the
|
|
|
+ * entry point uses a 16-bit integer, so we're limited
|
|
|
+ * in total table size
|
|
|
+ */
|
|
|
+#define SMBIOS_21_MAX_TABLES_LEN 0xffff
|
|
|
+
|
|
|
static void smbios_validate_table(MachineState *ms)
|
|
|
{
|
|
|
uint32_t expect_t4_count = smbios_legacy ?
|
|
@@ -375,6 +382,13 @@ static void smbios_validate_table(MachineState *ms)
|
|
|
expect_t4_count, smbios_type4_count);
|
|
|
exit(1);
|
|
|
}
|
|
|
+
|
|
|
+ if (smbios_ep_type == SMBIOS_ENTRY_POINT_21 &&
|
|
|
+ smbios_tables_len > SMBIOS_21_MAX_TABLES_LEN) {
|
|
|
+ error_report("SMBIOS 2.1 table length %zu exceeds %d",
|
|
|
+ smbios_tables_len, SMBIOS_21_MAX_TABLES_LEN);
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|