Commit f462141f authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

usb: fix usb_qdev_init error handling.



qdev doesn't call the ->exit callback on ->init failures, so we have to
take care ourself that we cleanup property on errors.

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 2af2a1b8
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent);

static char *usb_get_dev_path(DeviceState *dev);
static char *usb_get_fw_dev_path(DeviceState *qdev);
static int usb_qdev_exit(DeviceState *qdev);

static struct BusInfo usb_bus_info = {
    .name      = "USB",
@@ -75,12 +76,23 @@ static int usb_qdev_init(DeviceState *qdev, DeviceInfo *base)
    dev->auto_attach = 1;
    QLIST_INIT(&dev->strings);
    rc = usb_claim_port(dev);
    if (rc == 0) {
    if (rc != 0) {
        goto err;
    }
    rc = dev->info->init(dev);
    if (rc != 0) {
        goto err;
    }
    if (rc == 0 && dev->auto_attach) {
    if (dev->auto_attach) {
        rc = usb_device_attach(dev);
        if (rc != 0) {
            goto err;
        }
    }
    return 0;

err:
    usb_qdev_exit(qdev);
    return rc;
}