Patchwork Avoid segmentation fault for qdev device not found

login
register
mail settings
Submitter Glauber Costa
Date May 12, 2011, 12:55 p.m.
Message ID <1305204903-13283-1-git-send-email-glommer@redhat.com>
Download mbox | patch
Permalink /patch/95301/
State New
Headers show

Comments

Glauber Costa - May 12, 2011, 12:55 p.m.
qdev_try_create will cope well with a NULL bus, since it will assume
the main system bus by default. qdev_create, however, wants to print
a message, in which it instantiates the bus name. That simple and at
first inoffensive message will generate a segmentation found if the
reason for failure is a NULL bus.

I propose we avoid that - thus generating the normal hw_error by
always passing a valid bus to qdev_try_create - if none, be it the
main system bus.

The code for testing a NULL bus is not remove from qdev_try_create
because it is a externally visible function, and we want it to continue
working fine.

Signed-off-by: Glauber Costa <glommer@redhat.com>
---
 hw/qdev.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
Markus Armbruster - May 13, 2011, 8:41 a.m.
Glauber Costa <glommer@redhat.com> writes:

> qdev_try_create will cope well with a NULL bus, since it will assume
> the main system bus by default. qdev_create, however, wants to print
> a message, in which it instantiates the bus name. That simple and at
> first inoffensive message will generate a segmentation found if the
> reason for failure is a NULL bus.
>
> I propose we avoid that - thus generating the normal hw_error by
> always passing a valid bus to qdev_try_create - if none, be it the
> main system bus.
>
> The code for testing a NULL bus is not remove from qdev_try_create
> because it is a externally visible function, and we want it to continue
> working fine.
>
> Signed-off-by: Glauber Costa <glommer@redhat.com>

"NULL means implicit main system bus" is too clever.  See also commit
ec990eb6.  Beyond the scope of your simple fix, so:

Reviewed-by: Markus Armbruster <armbru@redhat.com>

Patch

diff --git a/hw/qdev.c b/hw/qdev.c
index 1aa1ea0..21ef075 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -108,6 +108,10 @@  DeviceState *qdev_create(BusState *bus, const char *name)
 {
     DeviceState *dev;
 
+    if (!bus) {
+        bus = sysbus_get_default();
+    }
+
     dev = qdev_try_create(bus, name);
     if (!dev) {
         hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name);