diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 472b4b406e..81560b8f5f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8465,6 +8465,29 @@ virSysinfoParseXML(const xmlNodePtr node, virXPathString("string(bios/entry[@name='version'])", ctxt); def->bios_date = virXPathString("string(bios/entry[@name='date'])", ctxt); + if (def->bios_date != NULL) { + char *ptr; + int month, day, year; + + /* Validate just the format of the date + * Expect mm/dd/yyyy or mm/dd/yy, + * where yy must be 00->99 and would be assumed to be 19xx + * a yyyy date should be 1900 and beyond + */ + if (virStrToLong_i(def->bios_date, &ptr, 10, &month) < 0 || + *ptr != '/' || + virStrToLong_i(ptr + 1, &ptr, 10, &day) < 0 || + *ptr != '/' || + virStrToLong_i(ptr + 1, &ptr, 10, &year) < 0 || + *ptr != '\0' || + (month < 1 || month > 12) || + (day < 1 || day > 31) || + (year < 0 || (year >= 100 && year < 1900))) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("Invalid BIOS 'date' format")); + goto error; + } + } def->bios_release = virXPathString("string(bios/entry[@name='release'])", ctxt); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smbios-date.xml b/tests/qemuxml2argvdata/qemuxml2argv-smbios-date.xml new file mode 100644 index 0000000000..7b2f33a84e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-smbios-date.xml @@ -0,0 +1,23 @@ + + smbios + 362d1fc1-df7d-193e-5c18-49a71bd1da66 + 1048576 + 1048576 + 1 + + hvm + + + + + 999/999/123 + + + + destroy + restart + restart + + /usr/bin/qemu + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index ac31d2a980..58aeddde29 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -825,6 +825,7 @@ mymain(void) DO_TEST("smbios", QEMU_CAPS_SMBIOS_TYPE); + DO_TEST_PARSE_ERROR("smbios-date", QEMU_CAPS_SMBIOS_TYPE); DO_TEST("watchdog", NONE); DO_TEST("watchdog-device", QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);