Commit ca44141d authored by Ashijeet Acharya's avatar Ashijeet Acharya Committed by John Snow
Browse files

ide: Fix memory leak in ide_register_restart_cb()



Fix a memory leak in ide_register_restart_cb() in hw/ide/core.c and add
idebus_unrealize() in hw/ide/qdev.c to have calls to
qemu_del_vm_change_state_handler() to deal with the dangling change
state handler during hot-unplugging ide devices which might lead to a
crash.

Signed-off-by: default avatarAshijeet Acharya <ashijeetacharya@gmail.com>
Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
Message-id: 1474995212-10580-1-git-send-email-ashijeetacharya@gmail.com
[Minor whitespace fix --js]
Signed-off-by: default avatarJohn Snow <jsnow@redhat.com>
parent c9f7acd5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2582,7 +2582,7 @@ static void ide_restart_cb(void *opaque, int running, RunState state)
void ide_register_restart_cb(IDEBus *bus)
{
    if (bus->dma->ops->restart_dma) {
        qemu_add_vm_change_state_handler(ide_restart_cb, bus);
        bus->vmstate = qemu_add_vm_change_state_handler(ide_restart_cb, bus);
    }
}

+11 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
/* --------------------------------- */

static char *idebus_get_fw_dev_path(DeviceState *dev);
static void idebus_unrealize(DeviceState *qdev, Error **errp);

static Property ide_props[] = {
    DEFINE_PROP_UINT32("unit", IDEDevice, unit, -1),
@@ -44,6 +45,15 @@ static void ide_bus_class_init(ObjectClass *klass, void *data)
    k->get_fw_dev_path = idebus_get_fw_dev_path;
}

static void idebus_unrealize(DeviceState *qdev, Error **errp)
{
    IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);

    if (bus->vmstate) {
        qemu_del_vm_change_state_handler(bus->vmstate);
    }
}

static const TypeInfo ide_bus_info = {
    .name = TYPE_IDE_BUS,
    .parent = TYPE_BUS,
@@ -355,6 +365,7 @@ static void ide_device_class_init(ObjectClass *klass, void *data)
    k->init = ide_qdev_init;
    set_bit(DEVICE_CATEGORY_STORAGE, k->categories);
    k->bus_type = TYPE_IDE_BUS;
    k->unrealize = idebus_unrealize;
    k->props = ide_props;
}

+1 −0
Original line number Diff line number Diff line
@@ -482,6 +482,7 @@ struct IDEBus {
    uint32_t retry_nsector;
    PortioList portio_list;
    PortioList portio2_list;
    VMChangeStateEntry *vmstate;
};

#define TYPE_IDE_DEVICE "ide-device"