[libvirt] [PATCH] Allow USB hostdev product to be 0x0000

Cole Robinson crobinso at redhat.com
Mon Jun 15 22:11:09 UTC 2009


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 at 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




More information about the libvir-list mailing list