Fix recently introduced bugs in -usbdevice host
Commit 26a9e82a has the following flaws: * It enabled DEBUG. * It referenced two properties by the wrong name in usb_host_device_open(), which crashes with "qdev_prop_set: property "USB Host Device.bus" not found". * It broke "-usbdevice host:auto:..." by calling parse_filter() incorrectly. * It broke parsing of "-usbdevice host:BUS.ADDR" and "-usbdevice host:VID:PRID" with a trivial pasto. * It broke wildcards in "-usbdevice host:auto:...". Before, the four filter components were stored as int, and the wildcard was encoded as -1. The faulty commit changed storage to uint32_t, and the wildcard encoding to 0. But it failed to update parse_filter() accordingly. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									21eb3a2ba3
								
							
						
					
					
						commit
						0745eb1e43
					
				
							
								
								
									
										26
									
								
								usb-linux.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								usb-linux.c
									
									
									
									
									
								
							@ -65,7 +65,7 @@ typedef int USBScanFunc(void *opaque, int bus_num, int addr, int class_id,
 | 
				
			|||||||
                        int vendor_id, int product_id,
 | 
					                        int vendor_id, int product_id,
 | 
				
			||||||
                        const char *product_name, int speed);
 | 
					                        const char *product_name, int speed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEBUG
 | 
					//#define DEBUG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
#define dprintf printf
 | 
					#define dprintf printf
 | 
				
			||||||
@ -1005,7 +1005,7 @@ device_init(usb_host_register_devices)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
USBDevice *usb_host_device_open(const char *devname)
 | 
					USBDevice *usb_host_device_open(const char *devname)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct USBAutoFilter filter = { 0, 0, 0, 0 };
 | 
					    struct USBAutoFilter filter;
 | 
				
			||||||
    USBDevice *dev;
 | 
					    USBDevice *dev;
 | 
				
			||||||
    USBHostDevice *s;
 | 
					    USBHostDevice *s;
 | 
				
			||||||
    char *p;
 | 
					    char *p;
 | 
				
			||||||
@ -1014,22 +1014,26 @@ USBDevice *usb_host_device_open(const char *devname)
 | 
				
			|||||||
    s = DO_UPCAST(USBHostDevice, dev, dev);
 | 
					    s = DO_UPCAST(USBHostDevice, dev, dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (strstr(devname, "auto:")) {
 | 
					    if (strstr(devname, "auto:")) {
 | 
				
			||||||
        if (parse_filter(devname+5, &filter) < 0)
 | 
					        if (parse_filter(devname, &filter) < 0)
 | 
				
			||||||
            goto fail;
 | 
					            goto fail;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        if ((p = strchr(devname, '.'))) {
 | 
					        if ((p = strchr(devname, '.'))) {
 | 
				
			||||||
            filter.bus_num    = strtoul(devname, NULL, 0);
 | 
					            filter.bus_num    = strtoul(devname, NULL, 0);
 | 
				
			||||||
            filter.addr    = strtoul(devname, NULL, 0);
 | 
					            filter.addr       = strtoul(p + 1, NULL, 0);
 | 
				
			||||||
 | 
					            filter.vendor_id  = 0;
 | 
				
			||||||
 | 
					            filter.product_id = 0;
 | 
				
			||||||
        } else if ((p = strchr(devname, ':'))) {
 | 
					        } else if ((p = strchr(devname, ':'))) {
 | 
				
			||||||
 | 
					            filter.bus_num    = 0;
 | 
				
			||||||
 | 
					            filter.addr       = 0;
 | 
				
			||||||
            filter.vendor_id  = strtoul(devname, NULL, 16);
 | 
					            filter.vendor_id  = strtoul(devname, NULL, 16);
 | 
				
			||||||
            filter.product_id = strtoul(devname, NULL, 16);
 | 
					            filter.product_id = strtoul(p + 1, NULL, 16);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            goto fail;
 | 
					            goto fail;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qdev_prop_set_uint32(&dev->qdev, "bus",       filter.bus_num);
 | 
					    qdev_prop_set_uint32(&dev->qdev, "hostbus",   filter.bus_num);
 | 
				
			||||||
    qdev_prop_set_uint32(&dev->qdev, "addr",      filter.addr);
 | 
					    qdev_prop_set_uint32(&dev->qdev, "hostaddr",  filter.addr);
 | 
				
			||||||
    qdev_prop_set_uint32(&dev->qdev, "vendorid",  filter.vendor_id);
 | 
					    qdev_prop_set_uint32(&dev->qdev, "vendorid",  filter.vendor_id);
 | 
				
			||||||
    qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
 | 
					    qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
 | 
				
			||||||
    qdev_init(&dev->qdev);
 | 
					    qdev_init(&dev->qdev);
 | 
				
			||||||
@ -1449,10 +1453,10 @@ static int parse_filter(const char *spec, struct USBAutoFilter *f)
 | 
				
			|||||||
    const char *p = spec;
 | 
					    const char *p = spec;
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    f->bus_num    = -1;
 | 
					    f->bus_num    = 0;
 | 
				
			||||||
    f->addr       = -1;
 | 
					    f->addr       = 0;
 | 
				
			||||||
    f->vendor_id  = -1;
 | 
					    f->vendor_id  = 0;
 | 
				
			||||||
    f->product_id = -1;
 | 
					    f->product_id = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = BUS; i < DONE; i++) {
 | 
					    for (i = BUS; i < DONE; i++) {
 | 
				
			||||||
    	p = strpbrk(p, ":.");
 | 
					    	p = strpbrk(p, ":.");
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user