mirror of
https://github.com/systemd/systemd.git
synced 2025-03-19 22:50:17 +03:00
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)
This commit is contained in:
parent
c32f71aa14
commit
9a2f16e4ed
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user