In certain cases a device model can init with neither a Device::realize or SysBusDevice::init (i.e. when its possible to do everything in Object::init). In this case, the device model should be able to leave both SysBusDevice::init and Device::realize as NULL. However what happens in this case in SysBus's default Device::realize function will try and call SysBusDevice::init without checking if it actually exists. A segfault ensues.
Fix by guarding the call to SysBusDevice::init against a NULL pointer. If no pointer is defined return 0 without action. Signed-off-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com> --- hw/sysbus.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/hw/sysbus.c b/hw/sysbus.c index 6d9d1df..72b309a 100644 --- a/hw/sysbus.c +++ b/hw/sysbus.c @@ -118,7 +118,7 @@ static int sysbus_device_init(DeviceState *dev) SysBusDevice *sd = SYS_BUS_DEVICE(dev); SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(sd); - return sbc->init(sd); + return sbc->init ? sbc->init(sd) : 0; } DeviceState *sysbus_create_varargs(const char *name, -- 1.7.0.4