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);
virSysinfoOEMStringsDef **stringsRet)
{
virSysinfoOEMStringsDef *strings = NULL;
- size_t i = 1;
int ret = -1;
const char *cur;
strings = g_new0(virSysinfoOEMStringsDef, 1);
while ((cur = strstr(cur, "String "))) {
+ char *collon = NULL;
+ unsigned int idx = 0;
char *eol;
cur += 7;
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",
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);
strings->values[strings->nvalues - 1] = g_strndup(cur, eol - cur);
}
- i++;
cur = eol;
}
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");