pci_qdev_init() checks whether return value is 0 or not to figure out pci 
device is initialized successfully. Otherwise, device_realize() in qdev checks 
that return value is negative value to figure out the device is realized 
successfully.
When pci device returns positive number, pci_qdev_init() thinks that error is 
occured and makes the device unregistered. Nevertheless, qdev thinks that 
device is realized.
Finally, crash is occured by commands like 'qtree' that traverse qdev list.

So, pci_qdev_init() returns -1 when init function returns not 0.

Signed-off-by: SeokYeon Hwang <syeon.hw...@samsung.com>
---
 hw/pci/pci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 371699c..c149fdf 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1766,7 +1766,7 @@ static int pci_qdev_init(DeviceState *qdev)
         rc = pc->init(pci_dev);
         if (rc != 0) {
             do_pci_unregister_device(pci_dev);
-            return rc;
+            return -1;
         }
     }
 
-- 
2.1.0


Reply via email to