mirror of https://github.com/xemu-project/xemu.git
qapi: Fix QemuOpts visitor regression on unvisited input
An off-by-one in commit 15c2f669e
meant that we were failing to
check for unparsed input in all QemuOpts visitors. Recent testsuite
additions show that fixing the obvious bug with bogus fields will
also fix the case of an incomplete list visit; update the tests to
match the new behavior.
Simple testcase:
./x86_64-softmmu/qemu-system-x86_64 -nodefaults -nographic -qmp stdio -numa node,size=1g
failed to diagnose that 'size' is not a valid argument to -numa, and
now once again reports:
qemu-system-x86_64: -numa node,size=1g: Invalid parameter 'size'
See also https://bugzilla.redhat.com/show_bug.cgi?id=1434666
CC: qemu-stable@nongnu.org
Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Tested-by: Laurent Vivier <lvivier@redhat.com>
Message-Id: <20170322144525.18964-4-eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
9a6d1acb3e
commit
21f88d021d
|
@ -164,7 +164,7 @@ opts_check_struct(Visitor *v, Error **errp)
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
GQueue *any;
|
GQueue *any;
|
||||||
|
|
||||||
if (ov->depth > 0) {
|
if (ov->depth > 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,8 +276,8 @@ static void
|
||||||
opts_check_list(Visitor *v, Error **errp)
|
opts_check_list(Visitor *v, Error **errp)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* FIXME should set error when unvisited elements remain. Mostly
|
* Unvisited list elements will be reported later when checking
|
||||||
* harmless, as the generated visits always visit all elements.
|
* whether unvisited struct members remain.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,6 +175,7 @@ expect_u64_max(OptsVisitorFixture *f, gconstpointer test_data)
|
||||||
static void
|
static void
|
||||||
test_opts_range_unvisited(void)
|
test_opts_range_unvisited(void)
|
||||||
{
|
{
|
||||||
|
Error *err = NULL;
|
||||||
intList *list = NULL;
|
intList *list = NULL;
|
||||||
intList *tail;
|
intList *tail;
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
|
@ -199,10 +200,11 @@ test_opts_range_unvisited(void)
|
||||||
g_assert_cmpint(tail->value, ==, 1);
|
g_assert_cmpint(tail->value, ==, 1);
|
||||||
tail = (intList *)visit_next_list(v, (GenericList *)tail, sizeof(*list));
|
tail = (intList *)visit_next_list(v, (GenericList *)tail, sizeof(*list));
|
||||||
g_assert(tail);
|
g_assert(tail);
|
||||||
visit_check_list(v, &error_abort); /* BUG: unvisited tail not reported */
|
visit_check_list(v, &error_abort); /* unvisited tail ignored until... */
|
||||||
visit_end_list(v, (void **)&list);
|
visit_end_list(v, (void **)&list);
|
||||||
|
|
||||||
visit_check_struct(v, &error_abort);
|
visit_check_struct(v, &err); /* ...here */
|
||||||
|
error_free_or_abort(&err);
|
||||||
visit_end_struct(v, NULL);
|
visit_end_struct(v, NULL);
|
||||||
|
|
||||||
qapi_free_intList(list);
|
qapi_free_intList(list);
|
||||||
|
@ -250,6 +252,7 @@ test_opts_range_beyond(void)
|
||||||
static void
|
static void
|
||||||
test_opts_dict_unvisited(void)
|
test_opts_dict_unvisited(void)
|
||||||
{
|
{
|
||||||
|
Error *err = NULL;
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
UserDefOptions *userdef;
|
UserDefOptions *userdef;
|
||||||
|
@ -258,11 +261,11 @@ test_opts_dict_unvisited(void)
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
|
||||||
v = opts_visitor_new(opts);
|
v = opts_visitor_new(opts);
|
||||||
/* BUG: bogus should be diagnosed */
|
visit_type_UserDefOptions(v, NULL, &userdef, &err);
|
||||||
visit_type_UserDefOptions(v, NULL, &userdef, &error_abort);
|
error_free_or_abort(&err);
|
||||||
visit_free(v);
|
visit_free(v);
|
||||||
qemu_opts_del(opts);
|
qemu_opts_del(opts);
|
||||||
qapi_free_UserDefOptions(userdef);
|
g_assert(!userdef);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in New Issue