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");