On Sat, Nov 30, 2019 at 08:42:30PM +0100, Markus Armbruster wrote: > isa_ipmi_bt_realize(), ipmi_isa_realize(), pci_ipmi_bt_realize(), and > pci_ipmi_kcs_realize() crash when IPMIInterfaceClass method init() > fails and their @errp argument is null. First messed up in commit > 0719029c47 "ipmi: Add an ISA KCS low-level interface", then imitated > in commit a9b74079cb "ipmi: Add a BT low-level interface" and commit > 12f983c6aa "ipmi: Add PCI IPMI interfaces". > > The bug can't bite as no caller actually passes null, and none of the > init() methods can actually fail. Fix it anyway.
Well, whatever. It looks correct and is better style. I've added this to my tree. -corey > > Cc: Corey Minyard <cminy...@mvista.com> > Signed-off-by: Markus Armbruster <arm...@redhat.com> > --- > hw/ipmi/isa_ipmi_bt.c | 7 +++++-- > hw/ipmi/isa_ipmi_kcs.c | 7 +++++-- > hw/ipmi/pci_ipmi_bt.c | 6 ++++-- > hw/ipmi/pci_ipmi_kcs.c | 6 ++++-- > 4 files changed, 18 insertions(+), 8 deletions(-) > > diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c > index 9a87ffd3f0..9fba5ed383 100644 > --- a/hw/ipmi/isa_ipmi_bt.c > +++ b/hw/ipmi/isa_ipmi_bt.c > @@ -70,6 +70,7 @@ static void isa_ipmi_bt_lower_irq(IPMIBT *ib) > > static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp) > { > + Error *err = NULL; > ISADevice *isadev = ISA_DEVICE(dev); > ISAIPMIBTDevice *iib = ISA_IPMI_BT(dev); > IPMIInterface *ii = IPMI_INTERFACE(dev); > @@ -85,9 +86,11 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error > **errp) > iib->bt.bmc->intf = ii; > iib->bt.opaque = iib; > > - iic->init(ii, 0, errp); > - if (*errp) > + iic->init(ii, 0, &err); > + if (err) { > + error_propagate(errp, err); > return; > + } > > if (iib->isairq > 0) { > isa_init_irq(isadev, &iib->irq, iib->isairq); > diff --git a/hw/ipmi/isa_ipmi_kcs.c b/hw/ipmi/isa_ipmi_kcs.c > index ca3ea36a3f..cc6bd817f2 100644 > --- a/hw/ipmi/isa_ipmi_kcs.c > +++ b/hw/ipmi/isa_ipmi_kcs.c > @@ -69,6 +69,7 @@ static void isa_ipmi_kcs_lower_irq(IPMIKCS *ik) > > static void ipmi_isa_realize(DeviceState *dev, Error **errp) > { > + Error *err = NULL; > ISADevice *isadev = ISA_DEVICE(dev); > ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(dev); > IPMIInterface *ii = IPMI_INTERFACE(dev); > @@ -84,9 +85,11 @@ static void ipmi_isa_realize(DeviceState *dev, Error > **errp) > iik->kcs.bmc->intf = ii; > iik->kcs.opaque = iik; > > - iic->init(ii, 0, errp); > - if (*errp) > + iic->init(ii, 0, &err); > + if (err) { > + error_propagate(errp, err); > return; > + } > > if (iik->isairq > 0) { > isa_init_irq(isadev, &iik->irq, iik->isairq); > diff --git a/hw/ipmi/pci_ipmi_bt.c b/hw/ipmi/pci_ipmi_bt.c > index 6ed925a665..ba9cf016b5 100644 > --- a/hw/ipmi/pci_ipmi_bt.c > +++ b/hw/ipmi/pci_ipmi_bt.c > @@ -54,6 +54,7 @@ static void pci_ipmi_lower_irq(IPMIBT *ik) > > static void pci_ipmi_bt_realize(PCIDevice *pd, Error **errp) > { > + Error *err = NULL; > PCIIPMIBTDevice *pik = PCI_IPMI_BT(pd); > IPMIInterface *ii = IPMI_INTERFACE(pd); > IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii); > @@ -74,8 +75,9 @@ static void pci_ipmi_bt_realize(PCIDevice *pd, Error **errp) > pik->bt.raise_irq = pci_ipmi_raise_irq; > pik->bt.lower_irq = pci_ipmi_lower_irq; > > - iic->init(ii, 8, errp); > - if (*errp) { > + iic->init(ii, 8, &err); > + if (err) { > + error_propagate(errp, err); > return; > } > pci_register_bar(pd, 0, PCI_BASE_ADDRESS_SPACE_IO, &pik->bt.io); > diff --git a/hw/ipmi/pci_ipmi_kcs.c b/hw/ipmi/pci_ipmi_kcs.c > index eeba63baa4..99f46152f4 100644 > --- a/hw/ipmi/pci_ipmi_kcs.c > +++ b/hw/ipmi/pci_ipmi_kcs.c > @@ -54,6 +54,7 @@ static void pci_ipmi_lower_irq(IPMIKCS *ik) > > static void pci_ipmi_kcs_realize(PCIDevice *pd, Error **errp) > { > + Error *err = NULL; > PCIIPMIKCSDevice *pik = PCI_IPMI_KCS(pd); > IPMIInterface *ii = IPMI_INTERFACE(pd); > IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii); > @@ -74,8 +75,9 @@ static void pci_ipmi_kcs_realize(PCIDevice *pd, Error > **errp) > pik->kcs.raise_irq = pci_ipmi_raise_irq; > pik->kcs.lower_irq = pci_ipmi_lower_irq; > > - iic->init(ii, 8, errp); > - if (*errp) { > + iic->init(ii, 8, &err); > + if (err) { > + error_propagate(errp, err); > return; > } > pci_register_bar(pd, 0, PCI_BASE_ADDRESS_SPACE_IO, &pik->kcs.io); > -- > 2.21.0 >