diff mbox

qemu_opt_get_bool_helper: Fix option handling

Message ID f8d51d0ff71937c0aacf37c7c811adad82038697.1420733318.git.mprivozn@redhat.com
State New
Headers show

Commit Message

Michal Prívozník Jan. 8, 2015, 4:09 p.m. UTC
Well, after 49d2e648e8087 the options to -machine parameter no longer
has .desc nor .desc->type. That's mainly because the options are
dynamically added while .desc is allocated statically. Anyway, if user
tries to run:

   qemu-system-x86_64 -machine pc-i440fx-2.2,accel=kvm,usb=off

the arguments evaluation fails with:

   qemu_opt_get_bool_helper: Assertion `opt->desc && opt->desc->type ==
   QEMU_OPT_BOOL' failed.

Fix this by dropping the assert() which is useless after the mentioned
commit anyway.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 util/qemu-option.c | 1 -
 1 file changed, 1 deletion(-)

Comments

Eric Blake Jan. 8, 2015, 4:39 p.m. UTC | #1
On 01/08/2015 09:09 AM, Michal Privoznik wrote:
> Well, after 49d2e648e8087 the options to -machine parameter no longer
> has .desc nor .desc->type. That's mainly because the options are
> dynamically added while .desc is allocated statically. Anyway, if user
> tries to run:
> 
>    qemu-system-x86_64 -machine pc-i440fx-2.2,accel=kvm,usb=off
> 
> the arguments evaluation fails with:
> 
>    qemu_opt_get_bool_helper: Assertion `opt->desc && opt->desc->type ==
>    QEMU_OPT_BOOL' failed.
> 
> Fix this by dropping the assert() which is useless after the mentioned
> commit anyway.
> 
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  util/qemu-option.c | 1 -
>  1 file changed, 1 deletion(-)

There are several other open threads about this same issue.  The
consensus so far appears to be that the assert is catching a real bug,
and should remain, and that we are instead working on the patches to fix
the real bug.
Marcel Apfelbaum Jan. 8, 2015, 4:44 p.m. UTC | #2
On 01/08/2015 06:09 PM, Michal Privoznik wrote:
> Well, after 49d2e648e8087 the options to -machine parameter no longer
> has .desc nor .desc->type. That's mainly because the options are
> dynamically added while .desc is allocated statically. Anyway, if user
> tries to run:
>
>     qemu-system-x86_64 -machine pc-i440fx-2.2,accel=kvm,usb=off
>
> the arguments evaluation fails with:
>
>     qemu_opt_get_bool_helper: Assertion `opt->desc && opt->desc->type ==
>     QEMU_OPT_BOOL' failed.
>
> Fix this by dropping the assert() which is useless after the mentioned
> commit anyway.
>
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>   util/qemu-option.c | 1 -
>   1 file changed, 1 deletion(-)
>
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index a708241..478420f 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -384,7 +384,6 @@ static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
>           }
>           return ret;
>       }
> -    assert(opt->desc && opt->desc->type == QEMU_OPT_BOOL);
>       ret = opt->value.boolean;
>       if (del) {
>           qemu_opt_del_all(opts, name);
>

Hi Michal,
Thank you for the patch, but there is already a PULL request for a fix.

You can follow the details in this mail thread
https://www.mail-archive.com/qemu-devel@nongnu.org/msg272607.html

Thank you,
Marcel
Paolo Bonzini Jan. 8, 2015, 5:14 p.m. UTC | #3
On 08/01/2015 17:09, Michal Privoznik wrote:
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index a708241..478420f 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -384,7 +384,6 @@ static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
>          }
>          return ret;
>      }
> -    assert(opt->desc && opt->desc->type == QEMU_OPT_BOOL);
>      ret = opt->value.boolean;
>      if (del) {
>          qemu_opt_del_all(opts, name);
> 

opt->value.boolean is not initialized correctly if opt->desc is NULL.
See how it is assigned in qemu_opt_parse.

Paolo
diff mbox

Patch

diff --git a/util/qemu-option.c b/util/qemu-option.c
index a708241..478420f 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -384,7 +384,6 @@  static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
         }
         return ret;
     }
-    assert(opt->desc && opt->desc->type == QEMU_OPT_BOOL);
     ret = opt->value.boolean;
     if (del) {
         qemu_opt_del_all(opts, name);