From 394e901bc18196cc72d614c69cc8276c618e9b3e Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 28 Nov 2022 12:52:19 +0100 Subject: 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 --- lib.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 834388a..0366a13 100644 --- a/lib.c +++ b/lib.c @@ -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 */ *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; -- cgit v1.2.3