• G
    qdev: Add cleanup logic in device_set_realized() to avoid resource leak · 1d45a705
    Gonglei 提交于
    At present, this function doesn't have partial cleanup implemented,
    which will cause resource leaks in some scenarios.
    
    Example:
    
    1. Assume that "dc->realize(dev, &local_err)" executes successful
       and local_err == NULL;
    2. device hotplug in hotplug_handler_plug() executes but fails
       (it is prone to occur). Then local_err != NULL;
    3. error_propagate(errp, local_err) and return. But the resources
       which have been allocated in dc->realize() will be leaked.
    Simple backtrace:
      dc->realize()
       |->device_realize
                |->pci_qdev_init()
                    |->do_pci_register_device()
                    |->etc.
    
    Add fuller cleanup logic which assures that function can
    goto appropriate error label as local_err population is
    detected at each relevant point.
    Signed-off-by: NGonglei <arei.gonglei@huawei.com>
    Reviewed-by: NPeter Crosthwaite <peter.crosthwaite@xilinx.com>
    Cc: qemu-stable@nongnu.org
    Signed-off-by: NAndreas Färber <afaerber@suse.de>
    1d45a705
qdev.c 30.7 KB