diff mbox

qdev: Fix qdev_try_create() semantics

Message ID 1329443264-13819-1-git-send-email-afaerber@suse.de
State New
Headers show

Commit Message

Andreas Färber Feb. 17, 2012, 1:47 a.m. UTC
Since QOM'ification, qdev_try_create() uses object_new() internally,
which asserts "type != NULL" when the type is not registered.
This was revealed by the combination of kvmclock's kvm_enabled() check
and early QOM type registration.

Check whether the class exists before calling object_new(), so that
the caller (e.g., qdev_create) can fail gracefully, telling us which
device could not be created.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Cc: Anthony Liguori <aliguori@codemonkey.ws>
---
 hw/qdev.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

Comments

Andreas Färber Feb. 17, 2012, 2 a.m. UTC | #1
Am 17.02.2012 02:47, schrieb Andreas Färber:
> Since QOM'ification, qdev_try_create() uses object_new() internally,
> which asserts "type != NULL" when the type is not registered.
> This was revealed by the combination of kvmclock's kvm_enabled() check
> and early QOM type registration.
> 
> Check whether the class exists before calling object_new(), so that
> the caller (e.g., qdev_create) can fail gracefully, telling us which
> device could not be created.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> Cc: Anthony Liguori <aliguori@codemonkey.ws>

Er, it's late here... ;)

As one can guess I've managed to convert x86. Still need to cleanup but
I pushed my work branch for the curious (and as backup!):

http://repo.or.cz/w/qemu/afaerber.git/shortlog/refs/heads/qom-cpu

Andreas

> ---
>  hw/qdev.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/qdev.c b/hw/qdev.c
> index f0eb3a7..ee21d90 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -117,6 +117,9 @@ DeviceState *qdev_try_create(BusState *bus, const char *name)
>  {
>      DeviceState *dev;
>  
> +    if (object_class_by_name(name) == NULL) {
> +        return NULL;
> +    }
>      dev = DEVICE(object_new(name));
>      if (!dev) {
>          return NULL;
Anthony Liguori Feb. 17, 2012, 6:16 p.m. UTC | #2
On 02/16/2012 08:00 PM, Andreas Färber wrote:
> Am 17.02.2012 02:47, schrieb Andreas Färber:
>> Since QOM'ification, qdev_try_create() uses object_new() internally,
>> which asserts "type != NULL" when the type is not registered.
>> This was revealed by the combination of kvmclock's kvm_enabled() check
>> and early QOM type registration.
>>
>> Check whether the class exists before calling object_new(), so that
>> the caller (e.g., qdev_create) can fail gracefully, telling us which
>> device could not be created.
>>
>> Signed-off-by: Andreas Färber<afaerber@suse.de>
>> Cc: Anthony Liguori<aliguori@codemonkey.ws>
>
> Er, it's late here... ;)
>
> As one can guess I've managed to convert x86. Still need to cleanup but
> I pushed my work branch for the curious (and as backup!):
>
> http://repo.or.cz/w/qemu/afaerber.git/shortlog/refs/heads/qom-cpu

Applied.  Thanks.

Regards,

Anthony Liguori

>
> Andreas
>
>> ---
>>   hw/qdev.c |    3 +++
>>   1 files changed, 3 insertions(+), 0 deletions(-)
>>
>> diff --git a/hw/qdev.c b/hw/qdev.c
>> index f0eb3a7..ee21d90 100644
>> --- a/hw/qdev.c
>> +++ b/hw/qdev.c
>> @@ -117,6 +117,9 @@ DeviceState *qdev_try_create(BusState *bus, const char *name)
>>   {
>>       DeviceState *dev;
>>
>> +    if (object_class_by_name(name) == NULL) {
>> +        return NULL;
>> +    }
>>       dev = DEVICE(object_new(name));
>>       if (!dev) {
>>           return NULL;
>
diff mbox

Patch

diff --git a/hw/qdev.c b/hw/qdev.c
index f0eb3a7..ee21d90 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -117,6 +117,9 @@  DeviceState *qdev_try_create(BusState *bus, const char *name)
 {
     DeviceState *dev;
 
+    if (object_class_by_name(name) == NULL) {
+        return NULL;
+    }
     dev = DEVICE(object_new(name));
     if (!dev) {
         return NULL;