]> Git Repo - qemu.git/commitdiff
qemu-option: Guard against qemu_opts_set_defaults() misuse
authorMarkus Armbruster <[email protected]>
Fri, 2 Aug 2013 07:34:00 +0000 (09:34 +0200)
committerAnthony Liguori <[email protected]>
Mon, 12 Aug 2013 14:15:37 +0000 (09:15 -0500)
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 <[email protected]>
Signed-off-by: Markus Armbruster <[email protected]>
Reviewed-by: Eric Blake <[email protected]>
Message-id: 1375428840[email protected]
Signed-off-by: Anthony Liguori <[email protected]>
util/qemu-option.c

index 7a1552a512c1357cc9146e53940f0dd7cd58c810..4ebdc4c33c46cd63d7c9eb270361cfc684f0e49b 100644 (file)
@@ -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)) {
This page took 0.030027 seconds and 4 git commands to generate.