scripts/qapi/expr.py | 2 +- tests/qapi-schema/enum-dict-no-name.err | 2 ++ tests/qapi-schema/enum-dict-no-name.json | 2 ++ tests/qapi-schema/enum-dict-no-name.out | 0 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 tests/qapi-schema/enum-dict-no-name.err create mode 100644 tests/qapi-schema/enum-dict-no-name.json create mode 100644 tests/qapi-schema/enum-dict-no-name.out
New test case enum-dict-no-name.json crashes:
$ python3 scripts/qapi-gen.py tests/qapi-schema/enum-dict-no-name.json
Traceback (most recent call last):
[...]
File "/work/armbru/qemu/scripts/qapi/expr.py", line 458, in check_enum
member_name = member['name']
KeyError: 'name'
Root cause: we try to retrieve member 'name' before we check for
missing members. With that fixed, we get the expected error "'data'
member misses key 'name'".
Fixes: 0825f62c842f2c07c5471391c6d7fd3f4fe83732
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
scripts/qapi/expr.py | 2 +-
tests/qapi-schema/enum-dict-no-name.err | 2 ++
tests/qapi-schema/enum-dict-no-name.json | 2 ++
tests/qapi-schema/enum-dict-no-name.out | 0
4 files changed, 5 insertions(+), 1 deletion(-)
create mode 100644 tests/qapi-schema/enum-dict-no-name.err
create mode 100644 tests/qapi-schema/enum-dict-no-name.json
create mode 100644 tests/qapi-schema/enum-dict-no-name.out
diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py
index 496f7e0333..cf98923fa6 100644
--- a/scripts/qapi/expr.py
+++ b/scripts/qapi/expr.py
@@ -455,8 +455,8 @@ def check_enum(expr: _JSONObject, info: QAPISourceInfo) -> None:
for m in members]
for member in members:
source = "'data' member"
- member_name = member['name']
check_keys(member, info, source, ['name'], ['if'])
+ member_name = member['name']
check_name_is_str(member_name, info, source)
source = "%s '%s'" % (source, member_name)
# Enum members may start with a digit
diff --git a/tests/qapi-schema/enum-dict-no-name.err b/tests/qapi-schema/enum-dict-no-name.err
new file mode 100644
index 0000000000..3ce0c16987
--- /dev/null
+++ b/tests/qapi-schema/enum-dict-no-name.err
@@ -0,0 +1,2 @@
+enum-dict-no-name.json: In enum 'Enum':
+enum-dict-no-name.json:2: 'data' member misses key 'name'
diff --git a/tests/qapi-schema/enum-dict-no-name.json b/tests/qapi-schema/enum-dict-no-name.json
new file mode 100644
index 0000000000..5952a8662e
--- /dev/null
+++ b/tests/qapi-schema/enum-dict-no-name.json
@@ -0,0 +1,2 @@
+# enum member lacking a name
+{ 'enum': 'Enum', 'data': [ {} ] }
diff --git a/tests/qapi-schema/enum-dict-no-name.out b/tests/qapi-schema/enum-dict-no-name.out
new file mode 100644
index 0000000000..e69de29bb2
--
2.31.1
On Wed, Jun 16, 2021 at 09:21:21AM +0200, Markus Armbruster wrote: > New test case enum-dict-no-name.json crashes: > > $ python3 scripts/qapi-gen.py tests/qapi-schema/enum-dict-no-name.json > Traceback (most recent call last): > [...] > File "/work/armbru/qemu/scripts/qapi/expr.py", line 458, in check_enum > member_name = member['name'] > KeyError: 'name' > > Root cause: we try to retrieve member 'name' before we check for > missing members. With that fixed, we get the expected error "'data' > member misses key 'name'". > > Fixes: 0825f62c842f2c07c5471391c6d7fd3f4fe83732 > Signed-off-by: Markus Armbruster <armbru@redhat.com> > --- Reviewed-by: Eric Blake <eblake@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
On 6/16/21 3:21 AM, Markus Armbruster wrote:
> New test case enum-dict-no-name.json crashes:
>
> $ python3 scripts/qapi-gen.py tests/qapi-schema/enum-dict-no-name.json
> Traceback (most recent call last):
> [...]
> File "/work/armbru/qemu/scripts/qapi/expr.py", line 458, in check_enum
> member_name = member['name']
> KeyError: 'name'
>
> Root cause: we try to retrieve member 'name' before we check for
> missing members. With that fixed, we get the expected error "'data'
> member misses key 'name'".
>
Whoops! Good spot.
> Fixes: 0825f62c842f2c07c5471391c6d7fd3f4fe83732
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
> ---
> scripts/qapi/expr.py | 2 +-
> tests/qapi-schema/enum-dict-no-name.err | 2 ++
> tests/qapi-schema/enum-dict-no-name.json | 2 ++
> tests/qapi-schema/enum-dict-no-name.out | 0
> 4 files changed, 5 insertions(+), 1 deletion(-)
> create mode 100644 tests/qapi-schema/enum-dict-no-name.err
> create mode 100644 tests/qapi-schema/enum-dict-no-name.json
> create mode 100644 tests/qapi-schema/enum-dict-no-name.out
>
> diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py
> index 496f7e0333..cf98923fa6 100644
> --- a/scripts/qapi/expr.py
> +++ b/scripts/qapi/expr.py
> @@ -455,8 +455,8 @@ def check_enum(expr: _JSONObject, info: QAPISourceInfo) -> None:
> for m in members]
> for member in members:
> source = "'data' member"
> - member_name = member['name']
> check_keys(member, info, source, ['name'], ['if'])
> + member_name = member['name']
> check_name_is_str(member_name, info, source)
> source = "%s '%s'" % (source, member_name)
> # Enum members may start with a digit
> diff --git a/tests/qapi-schema/enum-dict-no-name.err b/tests/qapi-schema/enum-dict-no-name.err
> new file mode 100644
> index 0000000000..3ce0c16987
> --- /dev/null
> +++ b/tests/qapi-schema/enum-dict-no-name.err
> @@ -0,0 +1,2 @@
> +enum-dict-no-name.json: In enum 'Enum':
> +enum-dict-no-name.json:2: 'data' member misses key 'name'
> diff --git a/tests/qapi-schema/enum-dict-no-name.json b/tests/qapi-schema/enum-dict-no-name.json
> new file mode 100644
> index 0000000000..5952a8662e
> --- /dev/null
> +++ b/tests/qapi-schema/enum-dict-no-name.json
> @@ -0,0 +1,2 @@
> +# enum member lacking a name
> +{ 'enum': 'Enum', 'data': [ {} ] }
> diff --git a/tests/qapi-schema/enum-dict-no-name.out b/tests/qapi-schema/enum-dict-no-name.out
> new file mode 100644
> index 0000000000..e69de29bb2
>
© 2016 - 2026 Red Hat, Inc.