Message ID | 20210616072121.626431-1-armbru@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qapi: Fix crash on missing enum member name | expand |
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>
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 >
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
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