qapi: Fix to reject union command and event arguments

A command's or event's 'data' must be a struct type, given either as a
dictionary, or as struct type name.

Commit dd883c6 tightened the checking there, but not enough: we still
accept 'union'.  Fix to reject it.

We may want to support union types there, but we'll have to extend
qapi-commands.py and qapi-events.py for it.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Markus Armbruster 2015-07-01 10:12:24 +02:00
parent d9658d58e3
commit 315932b5ed
6 changed files with 8 additions and 12 deletions

View File

@ -405,10 +405,9 @@ Client JSON Protocol command exchange.
The 'data' argument maps to the "arguments" dictionary passed in as The 'data' argument maps to the "arguments" dictionary passed in as
part of a Client JSON Protocol command. The 'data' member is optional part of a Client JSON Protocol command. The 'data' member is optional
and defaults to {} (an empty dictionary). If present, it must be the and defaults to {} (an empty dictionary). If present, it must be the
string name of a complex type, a one-element array containing the name string name of a complex type, or a dictionary that declares an
of a complex type, or a dictionary that declares an anonymous type anonymous type with the same semantics as a 'struct' expression, with
with the same semantics as a 'struct' expression, with one exception one exception noted below when 'gen' is used.
noted below when 'gen' is used.
The 'returns' member describes what will appear in the "return" field The 'returns' member describes what will appear in the "return" field
of a Client JSON Protocol reply on successful completion of a command. of a Client JSON Protocol reply on successful completion of a command.

View File

@ -499,7 +499,7 @@ def check_command(expr, expr_info):
check_type(expr_info, "'data' for command '%s'" % name, check_type(expr_info, "'data' for command '%s'" % name,
expr.get('data'), allow_dict=True, allow_optional=True, expr.get('data'), allow_dict=True, allow_optional=True,
allow_metas=['union', 'struct'], allow_star=allow_star) allow_metas=['struct'], allow_star=allow_star)
returns_meta = ['union', 'struct'] returns_meta = ['union', 'struct']
if name in returns_whitelist: if name in returns_whitelist:
returns_meta += ['built-in', 'alternate', 'enum'] returns_meta += ['built-in', 'alternate', 'enum']
@ -517,7 +517,7 @@ def check_event(expr, expr_info):
events.append(name) events.append(name)
check_type(expr_info, "'data' for event '%s'" % name, check_type(expr_info, "'data' for event '%s'" % name,
expr.get('data'), allow_dict=True, allow_optional=True, expr.get('data'), allow_dict=True, allow_optional=True,
allow_metas=['union', 'struct']) allow_metas=['struct'])
def check_union(expr, expr_info): def check_union(expr, expr_info):
name = expr['union'] name = expr['union']

View File

@ -0,0 +1 @@
tests/qapi-schema/args-union.json:4: 'data' for command 'oops' cannot use union type 'Uni'

View File

@ -1 +1 @@
0 1

View File

@ -1,4 +1,4 @@
# FIXME we should reject union arguments # we do not allow union arguments
# TODO should we support this? # TODO should we support this?
{ 'union': 'Uni', 'data': { 'case1': 'int', 'case2': 'str' } } { 'union': 'Uni', 'data': { 'case1': 'int', 'case2': 'str' } }
{ 'command': 'oops', 'data': 'Uni' } { 'command': 'oops', 'data': 'Uni' }

View File

@ -1,4 +0,0 @@
[OrderedDict([('union', 'Uni'), ('data', OrderedDict([('case1', 'int'), ('case2', 'str')]))]),
OrderedDict([('command', 'oops'), ('data', 'Uni')])]
[{'enum_name': 'UniKind', 'enum_values': None}]
[]