[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH v2 3/4] Validate the bios_date format for <sysinfo>



Add incorrectly formatted bios_date validation test
---
 src/conf/domain_conf.c                             | 24 ++++++++++++++++++++++
 .../qemuxml2argvdata/qemuxml2argv-smbios-date.xml  | 23 +++++++++++++++++++++
 tests/qemuxml2argvtest.c                           |  1 +
 3 files changed, 48 insertions(+)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-smbios-date.xml

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 862b997..d352055 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8437,6 +8437,30 @@ 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;
+        struct tm tm;
+        memset(&tm, 0, sizeof(tm));
+
+        /* 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, &tm.tm_mon) < 0 ||
+            *ptr != '/' ||
+            virStrToLong_i(ptr+1, &ptr, 10, &tm.tm_mday) < 0 ||
+            *ptr != '/' ||
+            virStrToLong_i(ptr+1, &ptr, 10, &tm.tm_year) < 0 ||
+            *ptr != '\0' ||
+            (tm.tm_mon < 0 || tm.tm_mon > 12) ||
+            (tm.tm_mday < 0 || tm.tm_mday > 31) ||
+            (tm.tm_year < 0 || (tm.tm_year >= 100 && tm.tm_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 0000000..7b2f33a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-smbios-date.xml
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+  <name>smbios</name>
+  <uuid>362d1fc1-df7d-193e-5c18-49a71bd1da66</uuid>
+  <memory unit='KiB'>1048576</memory>
+  <currentMemory unit='KiB'>1048576</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <smbios mode="sysinfo"/>
+  </os>
+  <sysinfo type="smbios">
+    <bios>
+      <entry name="date">999/999/123</entry>
+    </bios>
+  </sysinfo>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>restart</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu</emulator>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 98ceb83..0100937 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -815,6 +815,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);
-- 
1.8.1.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]