json_pointer: find null array elements

json_pointer_get_single_path() returned ENOENT when the array element
at an in-range index was NULL, which is how json-c stores a JSON null.
A null object member was already found, but on [0, null, 2] "/1" failed
with "not found", although RFC 6901 says it references the null value.

The array index is bounds-checked just before, so a NULL element now
resolves like a null member: json_pointer_get() returns 0 and sets
*res to NULL. This also fixes json_patch_apply(), which failed every
"test", "replace" and "remove" on a null array element, and every
"move" and "copy" from one, with "Did not find element referenced by
path field".

Added a json_pointer_get() test, and json_patch_tests.json cases that
mirror the existing null object member ones.
This commit is contained in:
Wleeaf authored and Eric Hawicz committed 2026-10-26 00:39:03 -04:00
1 parent 86fe287188
commit d9b375ff1b
5 files changed
+47 -10

No files matched your search

+4 -10
View File
@@ -102,16 +102,10 @@ static int json_pointer_get_single_path(struct json_object *obj, char *path,
return -1;
}
obj = json_object_array_get_idx(obj, *idx);
if (obj)
{
if (value)
*value = obj;
return 0;
}
/* Entry not found */
errno = ENOENT;
return -1;
/* A null element is stored as NULL, but it exists */
if (value)
*value = json_object_array_get_idx(obj, *idx);
return 0;
}
/* RFC states that we first must eval all ~1 then all ~0 */