diff mbox

bootdevice: fix segment fault when booting guest with '-kernel' and '-initrd'

Message ID 1425001784-6752-1-git-send-email-arei.gonglei@huawei.com
State New
Headers show

Commit Message

Gonglei (Arei) Feb. 27, 2015, 1:49 a.m. UTC
From: Gonglei <arei.gonglei@huawei.com>

Reproducer:

 $./qemu-system-x86_64 --enable-kvm -kernel /home/vmlinuz-2.6.32.12-0.7-default \
  -initrd /home/initrd-2.6.32.12-0.7-default -append \
 "root=/dev/ram rw console=ttyS0,115200" -dtb guest.dtb -vnc :10 --monitor stdio -smp 2
QEMU 2.2.50 monitor - type 'help' for more information
(qemu) Segmentation fault (core dumped)

Reported-by: Edivaldo de Araujo Pereira <edivaldoapereira@yahoo.com.br>
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
---
 bootdevice.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Comments

Paolo Bonzini Feb. 27, 2015, 2:15 p.m. UTC | #1
Looks good, I am applying it locally so that it can get into qemu.git
very soon.

Paolo

On 27/02/2015 02:49, arei.gonglei@huawei.com wrote:
> From: Gonglei <arei.gonglei@huawei.com>
> 
> Reproducer:
> 
>  $./qemu-system-x86_64 --enable-kvm -kernel /home/vmlinuz-2.6.32.12-0.7-default \
>   -initrd /home/initrd-2.6.32.12-0.7-default -append \
>  "root=/dev/ram rw console=ttyS0,115200" -dtb guest.dtb -vnc :10 --monitor stdio -smp 2
> QEMU 2.2.50 monitor - type 'help' for more information
> (qemu) Segmentation fault (core dumped)
> 
> Reported-by: Edivaldo de Araujo Pereira <edivaldoapereira@yahoo.com.br>
> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
> ---
>  bootdevice.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/bootdevice.c b/bootdevice.c
> index df9ab0e..673bfef 100644
> --- a/bootdevice.c
> +++ b/bootdevice.c
> @@ -223,10 +223,15 @@ char *get_boot_devices_list(size_t *size, bool ignore_suffixes)
>          }
>  
>          if (!ignore_suffixes) {
> -            d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus, i->dev);
> -            if (d) {
> -                assert(!i->suffix);
> -                suffix = d;
> +            if (i->dev) {
> +                d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus,
> +                                                          i->dev);
> +                if (d) {
> +                    assert(!i->suffix);
> +                    suffix = d;
> +                } else {
> +                    suffix = g_strdup(i->suffix);
> +                }
>              } else {
>                  suffix = g_strdup(i->suffix);
>              }
>
Gonglei (Arei) Feb. 28, 2015, 1:06 a.m. UTC | #2
On 2015/2/27 22:15, Paolo Bonzini wrote:
> Looks good, I am applying it locally so that it can get into qemu.git
> very soon.
> 
OK, thanks.

Regards,
-Gonglei
> Paolo
> 
> On 27/02/2015 02:49, arei.gonglei@huawei.com wrote:
>> From: Gonglei <arei.gonglei@huawei.com>
>>
>> Reproducer:
>>
>>  $./qemu-system-x86_64 --enable-kvm -kernel /home/vmlinuz-2.6.32.12-0.7-default \
>>   -initrd /home/initrd-2.6.32.12-0.7-default -append \
>>  "root=/dev/ram rw console=ttyS0,115200" -dtb guest.dtb -vnc :10 --monitor stdio -smp 2
>> QEMU 2.2.50 monitor - type 'help' for more information
>> (qemu) Segmentation fault (core dumped)
>>
>> Reported-by: Edivaldo de Araujo Pereira <edivaldoapereira@yahoo.com.br>
>> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
>> ---
>>  bootdevice.c | 13 +++++++++----
>>  1 file changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/bootdevice.c b/bootdevice.c
>> index df9ab0e..673bfef 100644
>> --- a/bootdevice.c
>> +++ b/bootdevice.c
>> @@ -223,10 +223,15 @@ char *get_boot_devices_list(size_t *size, bool ignore_suffixes)
>>          }
>>  
>>          if (!ignore_suffixes) {
>> -            d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus, i->dev);
>> -            if (d) {
>> -                assert(!i->suffix);
>> -                suffix = d;
>> +            if (i->dev) {
>> +                d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus,
>> +                                                          i->dev);
>> +                if (d) {
>> +                    assert(!i->suffix);
>> +                    suffix = d;
>> +                } else {
>> +                    suffix = g_strdup(i->suffix);
>> +                }
>>              } else {
>>                  suffix = g_strdup(i->suffix);
>>              }
>>
diff mbox

Patch

diff --git a/bootdevice.c b/bootdevice.c
index df9ab0e..673bfef 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -223,10 +223,15 @@  char *get_boot_devices_list(size_t *size, bool ignore_suffixes)
         }
 
         if (!ignore_suffixes) {
-            d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus, i->dev);
-            if (d) {
-                assert(!i->suffix);
-                suffix = d;
+            if (i->dev) {
+                d = qdev_get_own_fw_dev_path_from_handler(i->dev->parent_bus,
+                                                          i->dev);
+                if (d) {
+                    assert(!i->suffix);
+                    suffix = d;
+                } else {
+                    suffix = g_strdup(i->suffix);
+                }
             } else {
                 suffix = g_strdup(i->suffix);
             }