On 05/09/2013 09:58 AM, Martin Kletzander wrote:
On 05/09/2013 01:43 PM, John Ferlan wrote:
> On 05/09/2013 06:59 AM, Martin Kletzander wrote:
>> On 04/30/2013 08:19 PM, John Ferlan wrote:
>>> ---
>>> src/conf/domain_conf.c | 24 ++++++++++++++++++++++++
>>> 1 file changed, 24 insertions(+)
>>
>>> diff --git a/src/conf/domain_conf.c
b/src/conf/domain_conf.c
>>> index a8b5dfd..43273f8 100644
>>> --- a/src/conf/domain_conf.c
>>> +++ b/src/conf/domain_conf.c
>>> @@ -11591,6 +11591,30 @@ virDomainDefParseXML(xmlDocPtr xml,
>>> goto error;
>>> }
>>> }
>>> + if (def->sysinfo->bios_date != NULL) {
>>> + char *date = def->sysinfo->bios_date;
>>> + 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(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_year < 0 || (tm.tm_year >= 100 &&
tm.tm_year < 1900))) {
>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>
>> Seems like another abuse of internal error, but I don't know what to use
here,
>> properly. Maybe VIR_ERR_XML_DETAIL?
>>
>>> + _("Invalid BIOS 'date' format:
%s"),
>>> + def->sysinfo->bios_date);
>>
>> Unnecessarily long, you can do 's/def->sysinfo->bios_//' and save
one
>> line here ;-)
>>
>>> + goto error;
>>> + }
>>> + }
>>> }
>>>
>>> if ((tmp = virXPathString("string(./os/smbios/@mode)", ctxt)))
{
>>
>
> FYI: The above is essentially a cut-n-reformat for this particular need
> of virDomainGraphicsAuthDefParseXML(). And while I agree it's an eye
> strain to read - I also tried various strptime() formats then using
> strftime() to format it back..
>
I haven't seen it being used somewhere else, but makes sense also due
to the rest of the mail.
I guess I agree in principal that a month of 99 or a date of 99 would be
incorrect and since we're doing some sort of validation it wouldn't hurt
to do a bit more. Doing full blown is the days in the month right and
handling leap year - is just outside the realm. My guess is that
somewhere some code will do a similar strptime() like call anyway.
So I made the change:
*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,
- _("Invalid BIOS 'date' format: %s"),
- def->sysinfo->bios_date);
+ virReportError(VIR_ERR_XML_DETAIL, "%s",
+ _("Invalid BIOS 'date' format"));
>>
...
And did squash/add the test provided - thanks! I also tried a couple of
other dates (both good and bad) during self testing to make sure the
code validated properly...
Going to do something similar with uuid validation shortly...
John
I'd add it to qemuxml2argvtest with invalid date and
DO_TEST_PARSE_ERROR.
Example (feel free to use it, it's tested):
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 1286273..7d5c3d0 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -814,6 +814,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);
--
Martin