aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2014-09-12 21:24:34 +0200
committerGerd Hoffmann <kraxel@redhat.com>2014-09-22 09:55:55 +0200
commit31376776d045c7ee0a1570c139ef30b6cb8f5b01 (patch)
treea71068ddd503ff53f16ad1ff8b779d0d1b76d18a
parent07e2863d0271ac6c05206d8ce9e4f4c39b25d3ea (diff)
downloadqemu-31376776d045c7ee0a1570c139ef30b6cb8f5b01.zip
qemu-31376776d045c7ee0a1570c139ef30b6cb8f5b01.tar.gz
qemu-31376776d045c7ee0a1570c139ef30b6cb8f5b01.tar.bz2
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>
-rw-r--r--hw/usb/dev-storage.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index ae4efcb..eb75f6a 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -666,8 +666,10 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
char fmt[32];
/* parse -usbdevice disk: syntax into drive opts */
- snprintf(id, sizeof(id), "usb%d", nr++);
- opts = qemu_opts_create(qemu_find_opts("drive"), id, 0, NULL);
+ do {
+ snprintf(id, sizeof(id), "usb%d", nr++);
+ opts = qemu_opts_create(qemu_find_opts("drive"), id, 1, NULL);
+ } while (!opts);
p1 = strchr(filename, ':');
if (p1++) {