Product = 0 is a valid value based on this bug report:
https://www.redhat.com/archives/libvir-list/2009-May/msg00368.html
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/domain_conf.c | 12 ++++++++----
.../qemuxml2argv-hostdev-usb-product.args | 2 +-
.../qemuxml2argv-hostdev-usb-product.xml | 6 ++++++
3 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/src/domain_conf.c b/src/domain_conf.c
index c695820..94082a5 100644
--- a/src/domain_conf.c
+++ b/src/domain_conf.c
@@ -1660,8 +1660,13 @@ virDomainHostdevSubsysUsbDefParseXML(virConnectPtr conn,
int flags ATTRIBUTE_UNUSED) {
int ret = -1;
+ int got_product;
xmlNodePtr cur;
+ /* Product can validly be 0, so we need some extra help to determine
+ * if it is uninitialized*/
+ got_product = 0;
+
cur = node->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
@@ -1686,6 +1691,7 @@ virDomainHostdevSubsysUsbDefParseXML(virConnectPtr conn,
char* product = virXMLPropString(cur, "id");
if (product) {
+ got_product = 1;
if (virStrToLong_ui(product, NULL, 0,
&def->source.subsys.u.usb.product) < 0)
{
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
@@ -1745,14 +1751,12 @@ virDomainHostdevSubsysUsbDefParseXML(virConnectPtr conn,
cur = cur->next;
}
- if (def->source.subsys.u.usb.vendor == 0 &&
- def->source.subsys.u.usb.product != 0) {
+ if (def->source.subsys.u.usb.vendor == 0 && got_product) {
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("missing vendor"));
goto out;
}
- if (def->source.subsys.u.usb.vendor != 0 &&
- def->source.subsys.u.usb.product == 0) {
+ if (def->source.subsys.u.usb.vendor != 0 && !got_product) {
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("missing product"));
goto out;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.args
b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.args
index e207871..f4c8f60 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.args
@@ -1 +1 @@
-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214
-smp 1 -nographic -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none
-serial none -parallel none -usb -usbdevice host:0204:6025
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214
-smp 1 -nographic -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none
-serial none -parallel none -usb -usbdevice host:0204:6025 -usbdevice host:1234:0000
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.xml
b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.xml
index b861665..6cb1ba1 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.xml
@@ -24,5 +24,11 @@
<product id='0x6025'/>
</source>
</hostdev>
+ <hostdev mode='subsystem' type='usb' managed='no'>
+ <source>
+ <vendor id='0x1234'/>
+ <product id='0x0000'/>
+ </source>
+ </hostdev>
</devices>
</domain>
--
1.6.0.6