218e99
From c4ffa69bdec932cf674d92355967ce2876296893 Mon Sep 17 00:00:00 2001
218e99
From: Markus Armbruster <armbru@redhat.com>
218e99
Date: Tue, 6 Aug 2013 13:17:01 +0200
218e99
Subject: [PATCH 08/28] qemu-option: Fix qemu_opts_set_defaults() for corner cases
218e99
218e99
RH-Author: Markus Armbruster <armbru@redhat.com>
218e99
Message-id: <1375795025-28674-3-git-send-email-armbru@redhat.com>
218e99
Patchwork-id: 52990
218e99
O-Subject: [PATCH 7.0 qemu-kvm 2/6] qemu-option: Fix qemu_opts_set_defaults() for corner cases
218e99
Bugzilla: 980782
218e99
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
218e99
RH-Acked-by: Michal Novotny <minovotn@redhat.com>
218e99
RH-Acked-by: Orit Wasserman <owasserm@redhat.com>
218e99
218e99
Commit 4f6dd9a changed the initialization of opts in opts_parse() to
218e99
this:
218e99
218e99
    if (defaults) {
218e99
        if (!id && !QTAILQ_EMPTY(&list->head)) {
218e99
            opts = qemu_opts_find(list, NULL);
218e99
        } else {
218e99
            opts = qemu_opts_create(list, id, 0);
218e99
        }
218e99
    } else {
218e99
        opts = qemu_opts_create(list, id, 1);
218e99
    }
218e99
218e99
Same as before for !defaults.
218e99
218e99
If defaults is true, and params has no ID, and options exist, we use
218e99
the first assignment.  It sets opts to null if all options have an ID.
218e99
opts_parse() then returns null.  qemu_opts_set_defaults() asserts the
218e99
value is non-null.  It's the only caller that passes true for
218e99
defaults.
218e99
218e99
To reproduce, try "-M xenpv -machine id=foo" (yes, "id=foo" is silly,
218e99
but it shouldn't crash).
218e99
218e99
I believe the function attempts to do the following:
218e99
218e99
    If options don't yet exist, create new options
218e99
    Else, if defaults, modify the existing options
218e99
    Else, if list->merge_lists, modify the existing options
218e99
    Else, fail
218e99
218e99
A straightforward call of qemu_opts_create() does exactly that.
218e99
218e99
Cc: Jan Kiszka <jan.kiszka@siemens.com>
218e99
Signed-off-by: Markus Armbruster <armbru@redhat.com>
218e99
Message-id: 1372943363-24081-3-git-send-email-armbru@redhat.com
218e99
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
218e99
(cherry picked from commit 6d4cd408686f5ae60b2b3b94b79f48ddedc2f39d)
218e99
218e99
The upstream commit message's claim that a "straightforward call of
218e99
qemu_opts_create() does exactly that" is wrong.  When
218e99
!list->merge_lists, and the option string doesn't contain id=, and
218e99
options without ID exist, then we don't actually modify the existing
218e99
options, we create new ones.
218e99
218e99
Not reachable, because we never pass lists with !list->merge_lists to
218e99
qemu_opts_set_defaults().
218e99
218e99
Patch adding a suitable assertion pending upstream.
218e99
---
218e99
 util/qemu-option.c | 10 +---------
218e99
 1 file changed, 1 insertion(+), 9 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 util/qemu-option.c |   10 +---------
218e99
 1 files changed, 1 insertions(+), 9 deletions(-)
218e99
218e99
diff --git a/util/qemu-option.c b/util/qemu-option.c
218e99
index b6d2ac0..bdfbdb4 100644
218e99
--- a/util/qemu-option.c
218e99
+++ b/util/qemu-option.c
218e99
@@ -944,15 +944,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
218e99
         get_opt_value(value, sizeof(value), p+4);
218e99
         id = value;
218e99
     }
218e99
-    if (defaults) {
218e99
-        if (!id && !QTAILQ_EMPTY(&list->head)) {
218e99
-            opts = qemu_opts_find(list, NULL);
218e99
-        } else {
218e99
-            opts = qemu_opts_create(list, id, 0, &local_err);
218e99
-        }
218e99
-    } else {
218e99
-        opts = qemu_opts_create(list, id, 1, &local_err);
218e99
-    }
218e99
+    opts = qemu_opts_create(list, id, !defaults, &local_err);
218e99
     if (opts == NULL) {
218e99
         if (error_is_set(&local_err)) {
218e99
             qerror_report_err(local_err);
218e99
-- 
218e99
1.7.1
218e99