diff options
author | Jo-Philipp Wich <jo@mein.io> | 2022-11-28 12:52:19 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2022-11-29 10:03:04 +0100 |
commit | 394e901bc18196cc72d614c69cc8276c618e9b3e (patch) | |
tree | 91b5e2da81567aa5cee7fb4fcb3393f5b0cdc262 /lib.c | |
parent | 191a536c04382270538bc2973c6a97d4d66725f3 (diff) |
lib: uc_json(): accept trailing whitespace when parsing strings
Only raise a trailing garbage error if the given JSON source string is
followed by a non white space character.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 20 |
1 files changed, 14 insertions, 6 deletions
@@ -2354,20 +2354,28 @@ static struct json_tokener * uc_json_from_string(uc_vm_t *vm, uc_value_t *str, json_object **jso) { struct json_tokener *tok = xjs_new_tokener(); + size_t i; + char *p; /* NB: the len + 1 here is intentional to pass the terminating \0 byte * to the json-c parser. This is required to work-around upstream * issue #681 <https://github.com/json-c/json-c/issues/681> */ *jso = json_tokener_parse_ex(tok, ucv_string_get(str), ucv_string_length(str) + 1); - if (json_tokener_get_error(tok) == json_tokener_success && - json_tokener_get_parse_end(tok) < ucv_string_length(str)) { - uc_vm_raise_exception(vm, EXCEPTION_SYNTAX, - "Trailing garbage after JSON data"); + if (json_tokener_get_error(tok) == json_tokener_success) { + p = ucv_string_get(str); - json_tokener_free(tok); + for (i = json_tokener_get_parse_end(tok); i < ucv_string_length(str); i++) { + if (!isspace(p[i])) { + uc_vm_raise_exception(vm, EXCEPTION_SYNTAX, + "Trailing garbage after JSON data"); - return NULL; + + json_tokener_free(tok); + + return NULL; + } + } } return tok; |