summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2019-06-06 17:31:55 +0200
committerMattias Andrée <maandree@kth.se>2019-06-06 17:31:55 +0200
commit07d0987909f19ddb1273bb40489409bd074bd64e (patch)
tree9f851d505d0b63e021601450505241dd6e3292ef
parentFirst commit (diff)
downloadjson.h-07d0987909f19ddb1273bb40489409bd074bd64e.tar.gz
json.h-07d0987909f19ddb1273bb40489409bd074bd64e.tar.bz2
json.h-07d0987909f19ddb1273bb40489409bd074bd64e.tar.xz
Fix nesting of arrays and objects
Signed-off-by: Mattias Andrée <maandree@kth.se>
-rw-r--r--json.h65
1 files 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);