Skip to content

Commit

Permalink
qapi: Forbid 'any' inside an alternate
Browse files Browse the repository at this point in the history
The whole point of an alternate is to allow some type-safety while
still accepting more than one JSON type.  Meanwhile, the 'any'
type exists to bypass type-safety altogether.  The two are
incompatible: you can't accept every type, and still tell which
branch of the alternate to use for the parse; fix this to give a
sane error instead of a Python stack trace.

Note that other types that can't be alternate members are caught
earlier, by check_type().

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1455778109-6278-4-git-send-email-eblake@redhat.com>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
  • Loading branch information
ebblake authored and Markus Armbruster committed Feb 19, 2016
1 parent 02a57ae commit 4653430
Show file tree
Hide file tree
Showing 6 changed files with 11 additions and 1 deletion.
5 changes: 4 additions & 1 deletion scripts/qapi.py
Expand Up @@ -629,7 +629,10 @@ def check_alternate(expr, expr_info):
value,
allow_metas=['built-in', 'union', 'struct', 'enum'])
qtype = find_alternate_member_qtype(value)
assert qtype
if not qtype:
raise QAPIExprError(expr_info,
"Alternate '%s' member '%s' cannot use "
"type '%s'" % (name, key, value))
if qtype in types_seen:
raise QAPIExprError(expr_info,
"Alternate '%s' member '%s' can't "
Expand Down
1 change: 1 addition & 0 deletions tests/Makefile
Expand Up @@ -241,6 +241,7 @@ check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)

check-qtest-generic-y += tests/qom-test$(EXESUF)

qapi-schema += alternate-any.json
qapi-schema += alternate-array.json
qapi-schema += alternate-base.json
qapi-schema += alternate-clash.json
Expand Down
1 change: 1 addition & 0 deletions tests/qapi-schema/alternate-any.err
@@ -0,0 +1 @@
tests/qapi-schema/alternate-any.json:2: Alternate 'Alt' member 'one' cannot use type 'any'
1 change: 1 addition & 0 deletions tests/qapi-schema/alternate-any.exit
@@ -0,0 +1 @@
1
4 changes: 4 additions & 0 deletions tests/qapi-schema/alternate-any.json
@@ -0,0 +1,4 @@
# we do not allow the 'any' type as an alternate branch
{ 'alternate': 'Alt',
'data': { 'one': 'any',
'two': 'int' } }
Empty file.

0 comments on commit 4653430

Please sign in to comment.