diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2011-11-22 12:39:58 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2011-11-22 13:38:12 +0100 |
commit | 2af2a1b8d05a1a64c5005ed930137632b9d5aa22 (patch) | |
tree | 48def53b1e3398c8be21922623aa6bb34d5cd6f1 | |
parent | 40897c9c160393df922dfdb59cfa210048d3071d (diff) |
usb: make usb_create_simple catch and pass up errors.
Use qdev_init() instead of qdev_init_nofail(), usb device initialization
can fail, most common case being port and device speed mismatch. Handle
failures correctly and pass up NULL pointers then.
Also fixup usb_create_simple() callers (only one was buggy) to properly
check for NULL pointers before referncing the usb_create_simple() return
value.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | hw/usb-bt.c | 3 | ||||
-rw-r--r-- | hw/usb-bus.c | 11 |
2 files changed, 12 insertions, 2 deletions
diff --git a/hw/usb-bt.c b/hw/usb-bt.c index 529fa3355d..f30eec1ea2 100644 --- a/hw/usb-bt.c +++ b/hw/usb-bt.c @@ -528,6 +528,9 @@ USBDevice *usb_bt_init(HCIInfo *hci) if (!hci) return NULL; dev = usb_create_simple(NULL /* FIXME */, "usb-bt-dongle"); + if (!dev) { + return NULL; + } s = DO_UPCAST(struct USBBtState, dev, dev); s->dev.opaque = s; diff --git a/hw/usb-bus.c b/hw/usb-bus.c index 93f640d370..f8b9807232 100644 --- a/hw/usb-bus.c +++ b/hw/usb-bus.c @@ -139,10 +139,17 @@ USBDevice *usb_create(USBBus *bus, const char *name) USBDevice *usb_create_simple(USBBus *bus, const char *name) { USBDevice *dev = usb_create(bus, name); + int rc; + if (!dev) { - hw_error("Failed to create USB device '%s'\n", name); + error_report("Failed to create USB device '%s'\n", name); + return NULL; + } + rc = qdev_init(&dev->qdev); + if (rc < 0) { + error_report("Failed to initialize USB device '%s'\n", name); + return NULL; } - qdev_init_nofail(&dev->qdev); return dev; } |