From c960b2b853372bc3dd16b5a182e976df67116953 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Wed, 12 Apr 2017 11:21:48 +0200 Subject: [PATCH] cJSON_Utils: Fix size_t support of cJSONUtils_GetPointer --- cJSON_Utils.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/cJSON_Utils.c b/cJSON_Utils.c index dec06d5..cb0a9c6 100644 --- a/cJSON_Utils.c +++ b/cJSON_Utils.c @@ -194,6 +194,19 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(cJSON *object, cJSON *ta return NULL; } +/* non broken version of cJSON_GetArrayItem */ +static cJSON *get_array_item(const cJSON *array, size_t item) +{ + cJSON *child = array ? array->child : NULL; + while ((child != NULL) && (item > 0)) + { + item--; + child = child->next; + } + + return child; +} + CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) { /* follow path of the pointer */ @@ -201,22 +214,18 @@ CJSON_PUBLIC(cJSON *) cJSONUtils_GetPointer(cJSON *object, const char *pointer) { if (cJSON_IsArray(object)) { - size_t which = 0; + size_t index = 0; /* parse array index */ while ((*pointer >= '0') && (*pointer <= '9')) { - which = (10 * which) + (size_t)(*pointer++ - '0'); + index = (10 * index) + (size_t)(*pointer++ - '0'); } if (*pointer && (*pointer != '/')) { /* not end of string or new path token */ return NULL; } - if (which > INT_MAX) - { - return NULL; - } - object = cJSON_GetArrayItem(object, (int)which); + object = get_array_item(object, index); } else if (cJSON_IsObject(object)) {