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>
(cherry picked from commit 21f88d021d)
 Conflicts:
	qapi/opts-visitor.c
	tests/test-opts-visitor.c
 * drop changes related to 9cb8ef36 and a9416dc6 tests
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Eric Blake 2017-03-22 09:45:25 -05:00 committed by Michael Roth
parent c15c6d2594
commit 2f8ab9b1dd
2 changed files with 5 additions and 4 deletions

View File

@ -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;
} }

View File

@ -175,6 +175,7 @@ expect_u64_max(OptsVisitorFixture *f, gconstpointer test_data)
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;
@ -183,11 +184,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