[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 01/47] qapi: Fix error handling code on alternate con
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PULL 01/47] qapi: Fix error handling code on alternate conflict |
Date: |
Fri, 1 Sep 2017 14:55:25 +0200 |
From: Eduardo Habkost <address@hidden>
The conflict check added by commit c0644771 ("qapi: Reject
alternates that can't work with keyval_parse()") doesn't work
with the following declaration:
{ 'alternate': 'Alt',
'data': { 'one': 'bool',
'two': 'str' } }
It crashes with:
Traceback (most recent call last):
File "./scripts/qapi-types.py", line 295, in <module>
schema = QAPISchema(input_file)
File "/home/ehabkost/rh/proj/virt/qemu/scripts/qapi.py", line 1468, in
__init__
self.exprs = check_exprs(parser.exprs)
File "/home/ehabkost/rh/proj/virt/qemu/scripts/qapi.py", line 958, in
check_exprs
check_alternate(expr, info)
File "/home/ehabkost/rh/proj/virt/qemu/scripts/qapi.py", line 830, in
check_alternate
% (name, key, types_seen[qtype]))
KeyError: 'QTYPE_QSTRING'
This happens because the previously-seen conflicting member
('one') can't be found at types_seen[qtype], but at
types_seen['QTYPE_BOOL'].
Fix the bug by moving the error check to the same loop that adds
new items to types_seen, raising an exception if types_seen[qt]
is already set.
Add two additional test cases that can detect the bug.
Signed-off-by: Eduardo Habkost <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>
---
scripts/qapi.py | 8 ++++----
tests/Makefile.include | 2 ++
tests/qapi-schema/alternate-conflict-bool-string.err | 1 +
tests/qapi-schema/alternate-conflict-bool-string.exit | 1 +
tests/qapi-schema/alternate-conflict-bool-string.json | 4 ++++
tests/qapi-schema/alternate-conflict-bool-string.out | 0
tests/qapi-schema/alternate-conflict-num-string.err | 1 +
tests/qapi-schema/alternate-conflict-num-string.exit | 1 +
tests/qapi-schema/alternate-conflict-num-string.json | 4 ++++
tests/qapi-schema/alternate-conflict-num-string.out | 0
10 files changed, 18 insertions(+), 4 deletions(-)
create mode 100644 tests/qapi-schema/alternate-conflict-bool-string.err
create mode 100644 tests/qapi-schema/alternate-conflict-bool-string.exit
create mode 100644 tests/qapi-schema/alternate-conflict-bool-string.json
create mode 100644 tests/qapi-schema/alternate-conflict-bool-string.out
create mode 100644 tests/qapi-schema/alternate-conflict-num-string.err
create mode 100644 tests/qapi-schema/alternate-conflict-num-string.exit
create mode 100644 tests/qapi-schema/alternate-conflict-num-string.json
create mode 100644 tests/qapi-schema/alternate-conflict-num-string.out
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 8aa2775f12..3693b520da 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -825,11 +825,11 @@ def check_alternate(expr, info):
else:
conflicting.add('QTYPE_QNUM')
conflicting.add('QTYPE_QBOOL')
- if conflicting & set(types_seen):
- raise QAPISemError(info, "Alternate '%s' member '%s' can't "
- "be distinguished from member '%s'"
- % (name, key, types_seen[qtype]))
for qt in conflicting:
+ if qt in types_seen:
+ raise QAPISemError(info, "Alternate '%s' member '%s' can't "
+ "be distinguished from member '%s'"
+ % (name, key, types_seen[qt]))
types_seen[qt] = key
diff --git a/tests/Makefile.include b/tests/Makefile.include
index f08b7418f0..00af45ca85 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -376,6 +376,8 @@ qapi-schema += alternate-conflict-dict.json
qapi-schema += alternate-conflict-enum-bool.json
qapi-schema += alternate-conflict-enum-int.json
qapi-schema += alternate-conflict-string.json
+qapi-schema += alternate-conflict-bool-string.json
+qapi-schema += alternate-conflict-num-string.json
qapi-schema += alternate-empty.json
qapi-schema += alternate-nested.json
qapi-schema += alternate-unknown.json
diff --git a/tests/qapi-schema/alternate-conflict-bool-string.err
b/tests/qapi-schema/alternate-conflict-bool-string.err
new file mode 100644
index 0000000000..e52fee7620
--- /dev/null
+++ b/tests/qapi-schema/alternate-conflict-bool-string.err
@@ -0,0 +1 @@
+tests/qapi-schema/alternate-conflict-bool-string.json:2: Alternate 'Alt'
member 'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-bool-string.exit
b/tests/qapi-schema/alternate-conflict-bool-string.exit
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/qapi-schema/alternate-conflict-bool-string.exit
@@ -0,0 +1 @@
+1
diff --git a/tests/qapi-schema/alternate-conflict-bool-string.json
b/tests/qapi-schema/alternate-conflict-bool-string.json
new file mode 100644
index 0000000000..0544de10f3
--- /dev/null
+++ b/tests/qapi-schema/alternate-conflict-bool-string.json
@@ -0,0 +1,4 @@
+# alternate branches of 'str' type conflict with all scalar types
+{ 'alternate': 'Alt',
+ 'data': { 'one': 'bool',
+ 'two': 'str' } }
diff --git a/tests/qapi-schema/alternate-conflict-bool-string.out
b/tests/qapi-schema/alternate-conflict-bool-string.out
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/qapi-schema/alternate-conflict-num-string.err
b/tests/qapi-schema/alternate-conflict-num-string.err
new file mode 100644
index 0000000000..5ba3827dd1
--- /dev/null
+++ b/tests/qapi-schema/alternate-conflict-num-string.err
@@ -0,0 +1 @@
+tests/qapi-schema/alternate-conflict-num-string.json:2: Alternate 'Alt' member
'two' can't be distinguished from member 'one'
diff --git a/tests/qapi-schema/alternate-conflict-num-string.exit
b/tests/qapi-schema/alternate-conflict-num-string.exit
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/qapi-schema/alternate-conflict-num-string.exit
@@ -0,0 +1 @@
+1
diff --git a/tests/qapi-schema/alternate-conflict-num-string.json
b/tests/qapi-schema/alternate-conflict-num-string.json
new file mode 100644
index 0000000000..ae901449af
--- /dev/null
+++ b/tests/qapi-schema/alternate-conflict-num-string.json
@@ -0,0 +1,4 @@
+# alternate branches of 'str' type conflict with all scalar types
+{ 'alternate': 'Alt',
+ 'data': { 'one': 'number',
+ 'two': 'str' } }
diff --git a/tests/qapi-schema/alternate-conflict-num-string.out
b/tests/qapi-schema/alternate-conflict-num-string.out
new file mode 100644
index 0000000000..e69de29bb2
--
2.13.5
- [Qemu-devel] [PULL 00/47] QAPI patches for 2017-09-01, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 04/47] qdict: Add qdict_put_null() helper, and put it to use, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 16/47] qapi-schema: Document how generated documentation is ordered, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 14/47] qlit: Tighten QLit dict vs QDict comparison, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 01/47] qapi: Fix error handling code on alternate conflict,
Markus Armbruster <=
- [Qemu-devel] [PULL 03/47] qobject: Explain how QNum works, and why, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 13/47] tests/check-qlit: New, covering qobject/qlit.c, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 05/47] qlit: move qlit from check-qjson to qobject/, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 17/47] qapi-schema: Introspection doc is in the wrong section, fix, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 10/47] qlit: make qlit_equal_qobject() take const arguments, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 29/47] qapi-schema: Make block-core.json self-contained, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 07/47] qlit: Change compound literals to initializers, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 31/47] qapi-schema: Improve section headings, Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 41/47] qapi: Use qapi_enum_parse() in input_type_enum(), Markus Armbruster, 2017/09/01
- [Qemu-devel] [PULL 06/47] qlit: use QLit prefix consistently, Markus Armbruster, 2017/09/01