Skip to content

Commit

Permalink
qapi: Fix QemuOpts visitor regression on unvisited input
Browse files Browse the repository at this point in the history
An off-by-one in commit 15c2f66 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: [email protected]
Signed-off-by: Eric Blake <[email protected]>
Reviewed-by: Michael Roth <[email protected]>
Tested-by: Laurent Vivier <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Markus Armbruster <[email protected]>
Signed-off-by: Markus Armbruster <[email protected]>
  • Loading branch information
ebblake authored and Markus Armbruster committed Mar 22, 2017
1 parent 9a6d1ac commit 21f88d0
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
6 changes: 3 additions & 3 deletions qapi/opts-visitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ opts_check_struct(Visitor *v, Error **errp)
GHashTableIter iter;
GQueue *any;

if (ov->depth > 0) {
if (ov->depth > 1) {
return;
}

Expand Down Expand Up @@ -276,8 +276,8 @@ static void
opts_check_list(Visitor *v, Error **errp)
{
/*
* FIXME should set error when unvisited elements remain. Mostly
* harmless, as the generated visits always visit all elements.
* Unvisited list elements will be reported later when checking
* whether unvisited struct members remain.
*/
}

Expand Down
13 changes: 8 additions & 5 deletions tests/test-opts-visitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ expect_u64_max(OptsVisitorFixture *f, gconstpointer test_data)
static void
test_opts_range_unvisited(void)
{
Error *err = NULL;
intList *list = NULL;
intList *tail;
QemuOpts *opts;
Expand All @@ -199,10 +200,11 @@ test_opts_range_unvisited(void)
g_assert_cmpint(tail->value, ==, 1);
tail = (intList *)visit_next_list(v, (GenericList *)tail, sizeof(*list));
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_check_struct(v, &error_abort);
visit_check_struct(v, &err); /* ...here */
error_free_or_abort(&err);
visit_end_struct(v, NULL);

qapi_free_intList(list);
Expand Down Expand Up @@ -250,6 +252,7 @@ test_opts_range_beyond(void)
static void
test_opts_dict_unvisited(void)
{
Error *err = NULL;
QemuOpts *opts;
Visitor *v;
UserDefOptions *userdef;
Expand All @@ -258,11 +261,11 @@ test_opts_dict_unvisited(void)
&error_abort);

v = opts_visitor_new(opts);
/* BUG: bogus should be diagnosed */
visit_type_UserDefOptions(v, NULL, &userdef, &error_abort);
visit_type_UserDefOptions(v, NULL, &userdef, &err);
error_free_or_abort(&err);
visit_free(v);
qemu_opts_del(opts);
qapi_free_UserDefOptions(userdef);
g_assert(!userdef);
}

int
Expand Down

0 comments on commit 21f88d0

Please sign in to comment.