From 07d0987909f19ddb1273bb40489409bd074bd64e Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Thu, 6 Jun 2019 17:31:55 +0200 Subject: Fix nesting of arrays and objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- json.h | 65 ++++++++++++++++++++++++++++++----------------------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/json.h b/json.h index 9b5aacf..5f8ef2a 100644 --- a/json.h +++ b/json.h @@ -323,58 +323,48 @@ einval: } -static union json_h_value * -json_h_parse_(struct json_h_context *ctx, char *buf, size_t n) +static int +json_h_parse_(struct json_h_context *ctx, char *buf, size_t n, union json_h_value *value) { - union json_h_value value, *ret, *newarray; + union json_h_value *newarray; int r, size = 0; - r = json_h_next(ctx, buf, n, &value); + r = json_h_next(ctx, buf, n, value); if (r < 0) - return NULL; + return -1; if (!r) { errno = EINVAL; - return NULL; + return -1; } - ret = malloc(sizeof(*ret)); - if (!ret) - return NULL; - - if (value.type == JSON_H_OBJECT_START || value.type == JSON_H_ARRAY_START) { - ret->type = JSON_H_ARRAY; - ret->array.values = NULL; - ret->array.n = 0; - for (;;) { - if (ret->array.n == size) { + if (value->type == JSON_H_OBJECT_START || value->type == JSON_H_ARRAY_START) { + value->array.values = NULL; + for (value->array.n = 0;; value->array.n++) { + if (value->array.n == size) { size += 16; - newarray = realloc(ret->array.values, size * sizeof(*ret->array.values)); + newarray = realloc(value->array.values, size * sizeof(*value->array.values)); if (!newarray) { - json_h_free(ret); - return NULL; + json_h_free(value); + return -1; } - ret->array.values = newarray; + value->array.values = newarray; } - r = json_h_next(ctx, buf, n, &ret->array.values[ret->array.n]); - if (r <= 0) { - json_h_free(ret); - return NULL; + if (json_h_parse_(ctx, buf, n, &value->array.values[value->array.n])) { + json_h_destroy(value); + return -1; } - if (ret->array.values[ret->array.n].type == JSON_H_OBJECT_END) + if (value->array.values[value->array.n].type == JSON_H_OBJECT_END) { + value->array.n /= 2; + value->type = JSON_H_OBJECT; break; - if (ret->array.values[ret->array.n].type == JSON_H_ARRAY_END) + } else if (value->array.values[value->array.n].type == JSON_H_ARRAY_END) { + value->type = JSON_H_ARRAY; break; - ret->array.n += 1; - } - if (value.type == JSON_H_OBJECT_START) { - ret->array.n /= 2; - ret->type = JSON_H_OBJECT; + } } - } else { - *ret = value; } - return ret; + return 0; } @@ -385,10 +375,15 @@ json_h_parse(char *buf, size_t n) union json_h_value value, *ret; int r; - ret = json_h_parse_(&ctx, buf, n); + ret = malloc(sizeof(*ret)); if (!ret) return NULL; + if (json_h_parse_(&ctx, buf, n, ret)) { + free(ret); + return NULL; + } + r = json_h_next(&ctx, buf, n, &value); if (r < 0) { json_h_free(ret); -- cgit v1.2.3-70-g09d2