Commit 2af2a1b8 authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

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: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 40897c9c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;

+9 −2
Original line number Diff line number Diff line
@@ -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;
}