Previously, njs_sort_indexed_properties() cached the fast array backing
store pointer (array->start) once and then iterates. For a hole it
performed a generic property lookup that walks the prototype chain and
may invoke a user-defined getter. A getter that grows the same array
triggers njs_array_expand(), which reallocates the backing store and
frees the old buffer, leaving the cached pointer dangling. The
remaining iterations then read freed memory, and the stale values are
sorted and written back, exposing freed heap contents to script.