summaryrefslogtreecommitdiffhomepage
path: root/lib.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-11-28 12:52:19 +0100
committerJo-Philipp Wich <jo@mein.io>2022-11-29 10:03:04 +0100
commit394e901bc18196cc72d614c69cc8276c618e9b3e (patch)
tree91b5e2da81567aa5cee7fb4fcb3393f5b0cdc262 /lib.c
parent191a536c04382270538bc2973c6a97d4d66725f3 (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.c20
1 files changed, 14 insertions, 6 deletions
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 <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;