Patchwork vl.c: Avoid segfault when started with no arguments

login
register
mail settings
Submitter Peter Maydell
Date Feb. 22, 2012, 10:40 p.m.
Message ID <1329950400-24354-1-git-send-email-peter.maydell@linaro.org>
Download mbox | patch
Permalink /patch/142548/
State New
Headers show

Comments

Peter Maydell - Feb. 22, 2012, 10:40 p.m.
Fix a bug (introduced in commit a0abe47) where a command line which
specified no machine arguments (either explicitly or implicitly via
-kernel &co) would result in a segfault because of a NULL pointer
returned from qemu_opts_find(qemu_find_opts("machine"), 0).

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
Oops, sorry about that... I must have tested the case where you do
pass -kernel &co but forgot to test the case where you don't.

 vl.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)
Anthony Liguori - Feb. 24, 2012, 7:49 p.m.
On 02/22/2012 04:40 PM, Peter Maydell wrote:
> Fix a bug (introduced in commit a0abe47) where a command line which
> specified no machine arguments (either explicitly or implicitly via
> -kernel&co) would result in a segfault because of a NULL pointer
> returned from qemu_opts_find(qemu_find_opts("machine"), 0).
>
> Signed-off-by: Peter Maydell<peter.maydell@linaro.org>

Applied.  Thanks.

Regards,

Anthony Liguori

> ---
> Oops, sorry about that... I must have tested the case where you do
> pass -kernel&co but forgot to test the case where you don't.
>
>   vl.c |   17 ++++++++++-------
>   1 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 7a8cc08..8375576 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2188,7 +2188,7 @@ int main(int argc, char **argv, char **envp)
>       DisplayState *ds;
>       DisplayChangeListener *dcl;
>       int cyls, heads, secs, translation;
> -    QemuOpts *hda_opts = NULL, *opts;
> +    QemuOpts *hda_opts = NULL, *opts, *machine_opts;
>       QemuOptsList *olist;
>       int optind;
>       const char *optarg;
> @@ -3247,12 +3247,15 @@ int main(int argc, char **argv, char **envp)
>           exit(1);
>       }
>
> -    kernel_filename = qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
> -                                                  0), "kernel");
> -    initrd_filename = qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
> -                                                  0), "initrd");
> -    kernel_cmdline = qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
> -                                                 0), "append");
> +    machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
> +    if (machine_opts) {
> +        kernel_filename = qemu_opt_get(machine_opts, "kernel");
> +        initrd_filename = qemu_opt_get(machine_opts, "initrd");
> +        kernel_cmdline = qemu_opt_get(machine_opts, "append");
> +    } else {
> +        kernel_filename = initrd_filename = kernel_cmdline = NULL;
> +    }
> +
>       if (!kernel_cmdline) {
>           kernel_cmdline = "";
>       }

Patch

diff --git a/vl.c b/vl.c
index 7a8cc08..8375576 100644
--- a/vl.c
+++ b/vl.c
@@ -2188,7 +2188,7 @@  int main(int argc, char **argv, char **envp)
     DisplayState *ds;
     DisplayChangeListener *dcl;
     int cyls, heads, secs, translation;
-    QemuOpts *hda_opts = NULL, *opts;
+    QemuOpts *hda_opts = NULL, *opts, *machine_opts;
     QemuOptsList *olist;
     int optind;
     const char *optarg;
@@ -3247,12 +3247,15 @@  int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
-    kernel_filename = qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
-                                                  0), "kernel");
-    initrd_filename = qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
-                                                  0), "initrd");
-    kernel_cmdline = qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
-                                                 0), "append");
+    machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
+    if (machine_opts) {
+        kernel_filename = qemu_opt_get(machine_opts, "kernel");
+        initrd_filename = qemu_opt_get(machine_opts, "initrd");
+        kernel_cmdline = qemu_opt_get(machine_opts, "append");
+    } else {
+        kernel_filename = initrd_filename = kernel_cmdline = NULL;
+    }
+
     if (!kernel_cmdline) {
         kernel_cmdline = "";
     }