diff mbox

qemu-option: Guard against qemu_opts_set_defaults() misuse

Message ID 1375428840-5275-1-git-send-email-armbru@redhat.com
State New
Headers show

Commit Message

Markus Armbruster Aug. 2, 2013, 7:34 a.m. UTC
Commit 6d4cd40 fixed qemu_opts_set_defaults() for an existing corner
case, but broke it for another one that can't be reached in current
code.

Quote from its commit message:

    I believe [opts_parse()] attempts to do the following:

        If options don't yet exist, create new options
        Else, if defaults, modify the existing options
        Else, if list->merge_lists, modify the existing options
        Else, fail

The only caller that passes true for defaults is
qemu_opts_set_defaults().

The commit message then claims:

    A straightforward call of qemu_opts_create() does exactly that.

Wrong.  When !list->merge_lists, and the option string doesn't contain
id=, and options without ID exist, then we don't actually modify the
existing options, we create new ones.

Not reachable, because we never pass lists with !list->merge_lists to
qemu_opts_set_defaults().

Guard against possible (if unlikely) future misuse with assert().

Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-option.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Eric Blake Aug. 2, 2013, 1:37 p.m. UTC | #1
On 08/02/2013 01:34 AM, Markus Armbruster wrote:
> Commit 6d4cd40 fixed qemu_opts_set_defaults() for an existing corner
> case, but broke it for another one that can't be reached in current
> code.
> 

> 
> Not reachable, because we never pass lists with !list->merge_lists to
> qemu_opts_set_defaults().
> 
> Guard against possible (if unlikely) future misuse with assert().
> 
> Reported-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  util/qemu-option.c | 9 +++++++++
>  1 file changed, 9 insertions(+)

> +     * This code doesn't work for defaults && !list->merge_lists: when
> +     * params has no id=, and list has an element with !opts->id, it
> +     * appends a new element instead of returning the existing opts.
> +     * However, we got no use for this case.  Guard against possible

s/got/have/

Reviewed-by: Eric Blake <eblake@redhat.com>
Markus Armbruster Aug. 2, 2013, 4:51 p.m. UTC | #2
Eric Blake <eblake@redhat.com> writes:

> On 08/02/2013 01:34 AM, Markus Armbruster wrote:
>> Commit 6d4cd40 fixed qemu_opts_set_defaults() for an existing corner
>> case, but broke it for another one that can't be reached in current
>> code.
>> 
>
>> 
>> Not reachable, because we never pass lists with !list->merge_lists to
>> qemu_opts_set_defaults().
>> 
>> Guard against possible (if unlikely) future misuse with assert().
>> 
>> Reported-by: Peter Maydell <peter.maydell@linaro.org>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  util/qemu-option.c | 9 +++++++++
>>  1 file changed, 9 insertions(+)
>
>> +     * This code doesn't work for defaults && !list->merge_lists: when
>> +     * params has no id=, and list has an element with !opts->id, it
>> +     * appends a new element instead of returning the existing opts.
>> +     * However, we got no use for this case.  Guard against possible
>
> s/got/have/

I'd be fine with fixing this on commit.

> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!
Anthony Liguori Aug. 14, 2013, 4:28 p.m. UTC | #3
Applied.  Thanks.

Regards,

Anthony Liguori
diff mbox

Patch

diff --git a/util/qemu-option.c b/util/qemu-option.c
index 7a1552a..4ebdc4c 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -928,6 +928,15 @@  static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
         get_opt_value(value, sizeof(value), p+4);
         id = value;
     }
+
+    /*
+     * This code doesn't work for defaults && !list->merge_lists: when
+     * params has no id=, and list has an element with !opts->id, it
+     * appends a new element instead of returning the existing opts.
+     * However, we got no use for this case.  Guard against possible
+     * (if unlikely) future misuse:
+     */
+    assert(!defaults || list->merge_lists);
     opts = qemu_opts_create(list, id, !defaults, &local_err);
     if (opts == NULL) {
         if (error_is_set(&local_err)) {