An OOM vulnerability exists in the json_pointer_set function (and related functions).
See issue #916 for more details.
To fix that, added a sanity check in the is_valid_index function to limit the maximum value of a parsed array index.
Provided a configurable macro for modification.
Signed-off-by: lone <lonechan314@qq.com>
// but ULLONG_MAX will be longer than any array length so that's ok.
*idx = strtoull(path, NULL, 10);
+ // Check against a maximum to prevent excessive memory allocations.
+ // An extremely large index, even if it doesn't overflow size_t,
+ // will cause a huge memory allocation request via realloc,
+ // leading to an OOM.
+ if (*idx > JSON_C_POINTER_MAX_ARRAY_IDX)
+ {
+ errno = EINVAL;
+ return 0;
+ }
+
return 1;
}
extern "C" {
#endif
+/**
+ * Maximum array index for JSON Pointer, preventing excessive memory allocations.
+ * The default value is 10,000,000.
+ */
+#ifndef JSON_C_POINTER_MAX_ARRAY_IDX
+#define JSON_C_POINTER_MAX_ARRAY_IDX 10000000
+#endif
+
/**
* Retrieves a JSON sub-object from inside another JSON object
* using the JSON pointer notation as defined in RFC 6901