From: Lennart Poettering Date: Thu, 4 Jul 2024 12:34:35 +0000 (+0200) Subject: vmm: make sure we can handle smbios objects without variable part X-Git-Tag: v256.2~5 X-Git-Url: http://git-history.diyao.me/?a=commitdiff_plain;h=9a2f16e4edc490a289e3b22ab9f30e3e5bc73850;p=systemd%2F.git vmm: make sure we can handle smbios objects without variable part 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 (cherry picked from commit 44ec70489f377d1fa9f4e19aed95a7e39da7d93d) --- diff --git a/src/boot/efi/vmm.c b/src/boot/efi/vmm.c index 60e216d54c..bfc7acc052 100644 --- a/src/boot/efi/vmm.c +++ b/src/boot/efi/vmm.c @@ -241,13 +241,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; @@ -255,6 +263,7 @@ static const SmbiosHeader *get_smbios_table(uint8_t type, uint64_t *ret_size_lef size -= e + 1 - p; p = e + 1; + first = false; } }