From: Michal Privoznik Date: Thu, 18 Jul 2024 13:09:22 +0000 (+0200) Subject: virsysinfo: Calculate OEM string index better X-Git-Tag: v10.6.0-rc1~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd11c753f3f947d91ae0c8d2ba965e5661e25080;p=thirdparty%2Flibvirt.git virsysinfo: Calculate OEM string index better As can be seen in earlier commits, there can be two OEM strings with the same index. But since our parser (virSysinfoParseOEMStrings()) doesn't expect that, it increments index in each run and thus skips over these strings. Fortunately, we have the right index at hand - we're just skipping over it in a loop. Just reconstruct the index back inside the loop. Signed-off-by: Michal Privoznik Reviewed-by: Jiri Denemark --- diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c index 3d8ee7fa75..dbcbca62ed 100644 --- a/src/util/virsysinfo.c +++ b/src/util/virsysinfo.c @@ -895,13 +895,13 @@ virSysinfoParseX86Chassis(const char *base, static int -virSysinfoDMIDecodeOEMString(size_t i, +virSysinfoDMIDecodeOEMString(unsigned int idx, char **str) { g_autofree char *err = NULL; g_autoptr(virCommand) cmd = virCommandNewArgList(DMIDECODE, "--dump", "--oem-string", NULL); - virCommandAddArgFormat(cmd, "%zu", i); + virCommandAddArgFormat(cmd, "%u", idx); virCommandSetOutputBuffer(cmd, str); virCommandSetErrorBuffer(cmd, &err); @@ -936,7 +936,6 @@ virSysinfoParseOEMStrings(const char *base, virSysinfoOEMStringsDef **stringsRet) { virSysinfoOEMStringsDef *strings = NULL; - size_t i = 1; int ret = -1; const char *cur; @@ -946,6 +945,8 @@ virSysinfoParseOEMStrings(const char *base, strings = g_new0(virSysinfoOEMStringsDef, 1); while ((cur = strstr(cur, "String "))) { + char *collon = NULL; + unsigned int idx = 0; char *eol; cur += 7; @@ -956,8 +957,13 @@ virSysinfoParseOEMStrings(const char *base, goto cleanup; } - while (g_ascii_isdigit(*cur)) - cur++; + if (virStrToLong_ui(cur, &collon, 10, &idx) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Malformed output of dmidecode")); + goto cleanup; + } + + cur = collon; if (*cur != ':') { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -980,7 +986,7 @@ virSysinfoParseOEMStrings(const char *base, if (memchr(cur, '.', eol - cur)) { char *str; - if (virSysinfoDMIDecodeOEMString(i, &str) < 0) + if (virSysinfoDMIDecodeOEMString(idx, &str) < 0) goto cleanup; strings->values[strings->nvalues - 1] = g_steal_pointer(&str); @@ -988,7 +994,6 @@ virSysinfoParseOEMStrings(const char *base, strings->values[strings->nvalues - 1] = g_strndup(cur, eol - cur); } - i++; cur = eol; } diff --git a/tests/sysinfodata/aarch64-hpe-apollosysinfo.expect b/tests/sysinfodata/aarch64-hpe-apollosysinfo.expect index 331454834d..2b886f74fd 100644 --- a/tests/sysinfodata/aarch64-hpe-apollosysinfo.expect +++ b/tests/sysinfodata/aarch64-hpe-apollosysinfo.expect @@ -82,9 +82,7 @@ Default string ThunderX2 System - Ha ha ha try parsing\n - String 3: this correctly - String 4:then + Some valid OEM string Comanche diff --git a/tests/sysinfotest.c b/tests/sysinfotest.c index d8bd1f38ba..b666847379 100644 --- a/tests/sysinfotest.c +++ b/tests/sysinfotest.c @@ -63,7 +63,11 @@ testDMIDecodeDryRun(const char *const*args G_GNUC_UNUSED, return; } - if (STREQ(args[3], "3")) { + if (STREQ(args[3], "2")) { + *output = g_strdup("Some valid OEM string\n"); + *error = g_strdup_printf("No OEM string number %s", args[3]); + return; + } else if (STREQ(args[3], "3")) { *output = g_strdup("Ha ha ha try parsing\\n\n" " String 3: this correctly\n" " String 4:then\n");