diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 363afa7..7d986f5 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -3873,9 +3873,18 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls, /* pick correct index */ if (level < path_len && !path_nulls[level]) { - char *c = VARDATA_ANY(path_elems[level]); + char *keyptr = VARDATA_ANY(path_elems[level]); + int keylen = VARSIZE_ANY_EXHDR(path_elems[level]); + char c[20 + 1]; /* int64 = 18446744073709551615 (20 symbols) */ long lindex; + if (keylen > 20) + elog(ERROR, "path element at the position %d is not an integer", level + 1); + + /* fast copy to a stack (get cstring without bothering palloc) */ + memcpy(c, keyptr, keylen); + c[keylen] = '\0'; + errno = 0; lindex = strtol(c, &badp, 10); if (errno != 0 || badp == c || *badp != '\0' || lindex > INT_MAX ||