]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
vmm: make sure we can handle smbios objects without variable part
authorLennart Poettering <lennart@poettering.net>
Thu, 4 Jul 2024 12:34:35 +0000 (14:34 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Thu, 4 Jul 2024 18:08:09 +0000 (20:08 +0200)
An smbios object with no variable part is a special case, it's just
suffixed with two NUL btes. handle that properly.

This is inspired by a similar fix from https://github.com/systemd/systemd/pull/29726

src/boot/efi/vmm.c

index 0f268a1512b1bbccf3b0729c31d79dc10237921f..87b692cc8561e73e5c16acb0a8c76d8210d3666e 100644 (file)
@@ -242,13 +242,21 @@ static const SmbiosHeader *get_smbios_table(uint8_t type, uint64_t *ret_size_lef
                 size -= header->length;
                 p += header->length;
 
-                /* Skip over string table. */
+                /* Special case: if there are no strings appended, we'll see two NUL bytes, skip over them */
+                if (size >= 2 && p[0] == 0 && p[1] == 0) {
+                        size -= 2;
+                        p += 2;
+                        continue;
+                }
+
+                /* Skip over a populated string table. */
+                bool first = true;
                 for (;;) {
                         const uint8_t *e = memchr(p, 0, size);
                         if (!e)
                                 return NULL;
 
-                        if (e == p) {/* Double NUL byte means we've reached the end of the string table. */
+                        if (!first && e == p) {/* Double NUL byte means we've reached the end of the string table. */
                                 p++;
                                 size--;
                                 break;
@@ -256,6 +264,7 @@ static const SmbiosHeader *get_smbios_table(uint8_t type, uint64_t *ret_size_lef
 
                         size -= e + 1 - p;
                         p = e + 1;
+                        first = false;
                 }
         }