usb-storage: Fix how legacy init handles option ID clash
usb_msd_init() calls qemu_opts_create() with a made-up ID and false fail_if_exists. If the ID already exists, it happily messes up those options, then fails drive_new(), because the BlockDriverState with that ID already exists, too. Reproducer: -drive if=none,id=usb0,format=raw -usbdevice disk:tmp.qcow2 Pass true fail_if_exists to qemu_opts_create(), and if it fails, try the next made-up ID. The reproducer now succeeds, and creates an usb-storage device with ID usb1. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									07e2863d02
								
							
						
					
					
						commit
						31376776d0
					
				| 
						 | 
					@ -666,8 +666,10 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
 | 
				
			||||||
    char fmt[32];
 | 
					    char fmt[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* parse -usbdevice disk: syntax into drive opts */
 | 
					    /* parse -usbdevice disk: syntax into drive opts */
 | 
				
			||||||
    snprintf(id, sizeof(id), "usb%d", nr++);
 | 
					    do {
 | 
				
			||||||
    opts = qemu_opts_create(qemu_find_opts("drive"), id, 0, NULL);
 | 
					        snprintf(id, sizeof(id), "usb%d", nr++);
 | 
				
			||||||
 | 
					        opts = qemu_opts_create(qemu_find_opts("drive"), id, 1, NULL);
 | 
				
			||||||
 | 
					    } while (!opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    p1 = strchr(filename, ':');
 | 
					    p1 = strchr(filename, ':');
 | 
				
			||||||
    if (p1++) {
 | 
					    if (p1++) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue