|
@@ -1743,8 +1743,7 @@ static cJSON_bool print_object(const cJSON * const item, printbuffer * const out
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-/* Get Array size/item / object item. */
|
|
|
|
-CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
|
|
|
|
|
|
+static size_t get_array_size(const cJSON * const array)
|
|
{
|
|
{
|
|
cJSON *child = NULL;
|
|
cJSON *child = NULL;
|
|
size_t size = 0;
|
|
size_t size = 0;
|
|
@@ -1756,13 +1755,25 @@ CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
|
|
|
|
|
|
child = array->child;
|
|
child = array->child;
|
|
|
|
|
|
- while(child != NULL)
|
|
|
|
|
|
+ while (child != NULL)
|
|
{
|
|
{
|
|
size++;
|
|
size++;
|
|
child = child->next;
|
|
child = child->next;
|
|
}
|
|
}
|
|
|
|
|
|
- /* FIXME: Can overflow here. Cannot be fixed without breaking the API */
|
|
|
|
|
|
+ return size;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Get Array size/item / object item. */
|
|
|
|
+CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
|
|
|
|
+{
|
|
|
|
+ size_t size = get_array_size(array);
|
|
|
|
+
|
|
|
|
+ if (size > INT_MAX)
|
|
|
|
+ {
|
|
|
|
+ /* This is incorrect but can't be fixed without breaking the API */
|
|
|
|
+ return INT_MAX;
|
|
|
|
+ }
|
|
|
|
|
|
return (int)size;
|
|
return (int)size;
|
|
}
|
|
}
|
|
@@ -2891,6 +2902,14 @@ CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * cons
|
|
{
|
|
{
|
|
cJSON *a_element = NULL;
|
|
cJSON *a_element = NULL;
|
|
cJSON *b_element = NULL;
|
|
cJSON *b_element = NULL;
|
|
|
|
+ size_t a_size = get_array_size(a);
|
|
|
|
+ size_t b_size = get_array_size(b);
|
|
|
|
+
|
|
|
|
+ if (a_size != b_size)
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
cJSON_ArrayForEach(a_element, a)
|
|
cJSON_ArrayForEach(a_element, a)
|
|
{
|
|
{
|
|
/* TODO This has O(n^2) runtime, which is horrible! */
|
|
/* TODO This has O(n^2) runtime, which is horrible! */
|
|
@@ -2906,22 +2925,6 @@ CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * cons
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /* doing this twice, once on a and b to prevent true comparison if a subset of b
|
|
|
|
- * TODO: Do this the proper way, this is just a fix for now */
|
|
|
|
- cJSON_ArrayForEach(b_element, b)
|
|
|
|
- {
|
|
|
|
- a_element = get_object_item(a, b_element->string, case_sensitive);
|
|
|
|
- if (a_element == NULL)
|
|
|
|
- {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (!cJSON_Compare(b_element, a_element, case_sensitive))
|
|
|
|
- {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|