diff options
author | Markus Armbruster | 2018-12-06 13:17:43 +0100 |
---|---|---|
committer | Markus Armbruster | 2018-12-13 19:20:11 +0100 |
commit | 00382fa85126edc63720480fd22458e1af4e58c7 (patch) | |
tree | 6b0eebd23e31fcbdcb6c8a3ec0dd9da963e8fddc /qobject | |
parent | docs: Update references to JSON RFC (diff) | |
download | qemu-00382fa85126edc63720480fd22458e1af4e58c7.tar.gz qemu-00382fa85126edc63720480fd22458e1af4e58c7.tar.xz qemu-00382fa85126edc63720480fd22458e1af4e58c7.zip |
json: Fix to reject duplicate object member names
The JSON parser happily accepts duplicate object member names. The
last value wins. Reproducer #1:
$ qemu-system-x86_64 -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 93, "minor": 0, "major": 3},
"package": "v3.1.0-rc3-7-g87a45d86ed"}, "capabilities": []}}
{'execute':'qmp_capabilities'}
{"return": {}}
{'execute':'blockdev-add','arguments':{'driver':'null-co',
'node-name':'foo','node-name':'bar'}}
{"return": {}}
{'execute':'query-named-block-nodes'}
{"return": [{ [...] "node-name": "bar" [...] }]}
Reproducer #2 is iotest 229.
Fix the parser to reject duplicates, and fix iotest 229 not to use
them.
Reported-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20181206121743.20762-1-armbru@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
[Trailing whitespace tidied up]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'qobject')
-rw-r--r-- | qobject/json-parser.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/qobject/json-parser.c b/qobject/json-parser.c index 5a840dfd86..7a7ae9e8d1 100644 --- a/qobject/json-parser.c +++ b/qobject/json-parser.c @@ -288,6 +288,11 @@ static int parse_pair(JSONParserContext *ctxt, QDict *dict) goto out; } + if (qdict_haskey(dict, qstring_get_str(key))) { + parse_error(ctxt, token, "duplicate key"); + goto out; + } + qdict_put_obj(dict, qstring_get_str(key), value); qobject_unref(key); |