提交 6d4cd408 编写于 作者: M Markus Armbruster 提交者: Anthony Liguori

qemu-option: Fix qemu_opts_set_defaults() for corner cases

Commit 4f6dd9af changed the initialization of opts in opts_parse() to
this:

    if (defaults) {
        if (!id && !QTAILQ_EMPTY(&list->head)) {
            opts = qemu_opts_find(list, NULL);
        } else {
            opts = qemu_opts_create(list, id, 0);
        }
    } else {
        opts = qemu_opts_create(list, id, 1);
    }

Same as before for !defaults.

If defaults is true, and params has no ID, and options exist, we use
the first assignment.  It sets opts to null if all options have an ID.
opts_parse() then returns null.  qemu_opts_set_defaults() asserts the
value is non-null.  It's the only caller that passes true for
defaults.

To reproduce, try "-M xenpv -machine id=foo" (yes, "id=foo" is silly,
but it shouldn't crash).

I believe the function 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

A straightforward call of qemu_opts_create() does exactly that.

Cc: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
Message-id: 1372943363-24081-3-git-send-email-armbru@redhat.com
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 96bc97eb
...@@ -914,15 +914,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params, ...@@ -914,15 +914,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
get_opt_value(value, sizeof(value), p+4); get_opt_value(value, sizeof(value), p+4);
id = value; id = value;
} }
if (defaults) { opts = qemu_opts_create(list, id, !defaults, &local_err);
if (!id && !QTAILQ_EMPTY(&list->head)) {
opts = qemu_opts_find(list, NULL);
} else {
opts = qemu_opts_create(list, id, 0, &local_err);
}
} else {
opts = qemu_opts_create(list, id, 1, &local_err);
}
if (opts == NULL) { if (opts == NULL) {
if (error_is_set(&local_err)) { if (error_is_set(&local_err)) {
qerror_report_err(local_err); qerror_report_err(local_err);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册