diff --git a/cJSON_Utils.c b/cJSON_Utils.c index dec06d54d64127dcdaf9b436cccf6b4d337c00cb..cb0a9c676f5bec90d2bf7bda1f929a51211af917 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)) {