|
|
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 |
|