On 6/10/21 11:33 AM, Ilias Apalodimas wrote:
Commit e4f8e543f1a9("smbios: Drop the unused Kconfig options")
break SMBIOS tables.  The reason is that the patch drops the Kconfig
options *after* removing the code using them,  but that changes the semantics
of the code completely.  Prior to the change a non NULL value was used in
the 'product' and 'manufacturer ' fields.

Chapter 6.2 of the DMTF spec requires Manufacturer and Product Name to be
non-null on some of the tables. So let's add sane defaults for Type1/2/3.

* Before the patchset:

@Ilias, Simon:

Simon should take this patch as he has been the main contributor for SMBIOS.

Acked-by: Heinrich Schuchardt <xypron.g...@gmx.de>


<snip>
Handle 0x0002, DMI type 2, 14 bytes
Base Board Information
         Manufacturer: Not Specified
         Product Name: Not Specified
         Version: Not Specified
         Serial Number: Not Specified
         Asset Tag: Not Specified
         Features:
                 Board is a hosting board
         Location In Chassis: Not Specified
         Chassis Handle: 0x0000
         Type: Motherboard

Invalid entry length (0). DMI table is broken! Stop.

* After the patchset:

<snip>
Handle 0x0005, DMI type 32, 11 bytes
System Boot Information
         Status: No errors detected

Handle 0x0006, DMI type 127, 4 bytes
End Of Table

Fixes: e4f8e543f1a9 ("smbios: Drop the unused Kconfig options")
Signed-off-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>
---
This depends on https://lists.denx.de/pipermail/u-boot/2021-June/451761.html
  lib/smbios.c | 10 ++++++++++
  1 file changed, 10 insertions(+)

diff --git a/lib/smbios.c b/lib/smbios.c
index abdd157a7084..e2c6b1a44ee3 100644
--- a/lib/smbios.c
+++ b/lib/smbios.c
@@ -259,7 +259,11 @@ static int smbios_write_type1(ulong *current, int handle,
        fill_smbios_header(t, SMBIOS_SYSTEM_INFORMATION, len, handle);
        smbios_set_eos(ctx, t->eos);
        t->manufacturer = smbios_add_prop(ctx, "manufacturer");
+       if (!t->manufacturer)
+               t->manufacturer = smbios_add_string(ctx, "Unknown");
        t->product_name = smbios_add_prop(ctx, "product");
+       if (!t->product_name)
+               t->product_name = smbios_add_string(ctx, "Unknown Product");
        t->version = smbios_add_prop_si(ctx, "version",
                                        SYSINFO_ID_SMBIOS_SYSTEM_VERSION);
        if (serial_str) {
@@ -289,7 +293,11 @@ static int smbios_write_type2(ulong *current, int handle,
        fill_smbios_header(t, SMBIOS_BOARD_INFORMATION, len, handle);
        smbios_set_eos(ctx, t->eos);
        t->manufacturer = smbios_add_prop(ctx, "manufacturer");
+       if (!t->manufacturer)
+               t->manufacturer = smbios_add_string(ctx, "Unknown");
        t->product_name = smbios_add_prop(ctx, "product");
+       if (!t->product_name)
+               t->product_name = smbios_add_string(ctx, "Unknown Product");
        t->version = smbios_add_prop_si(ctx, "version",
                                        SYSINFO_ID_SMBIOS_BASEBOARD_VERSION);
        t->asset_tag_number = smbios_add_prop(ctx, "asset-tag");
@@ -314,6 +322,8 @@ static int smbios_write_type3(ulong *current, int handle,
        fill_smbios_header(t, SMBIOS_SYSTEM_ENCLOSURE, len, handle);
        smbios_set_eos(ctx, t->eos);
        t->manufacturer = smbios_add_prop(ctx, "manufacturer");
+       if (!t->manufacturer)
+               t->manufacturer = smbios_add_string(ctx, "Unknown");
        t->chassis_type = SMBIOS_ENCLOSURE_DESKTOP;
        t->bootup_state = SMBIOS_STATE_SAFE;
        t->power_supply_state = SMBIOS_STATE_SAFE;


Reply via email to