Преглед изворни кода

cJSON_Utils: Fix size_t support of cJSONUtils_GetPointer

Max Bruckner пре 8 година
родитељ
комит
c960b2b853
1 измењених фајлова са 16 додато и 7 уклоњено
  1. 16 7
      cJSON_Utils.c

+ 16 - 7
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))
         {