Fix jsonb_object_agg crash after eliminating null-valued pairs. master github/master
authorTom Lane <[email protected]>
Sat, 13 Dec 2025 21:18:23 +0000 (16:18 -0500)
committerTom Lane <[email protected]>
Sat, 13 Dec 2025 21:18:29 +0000 (16:18 -0500)
commitef5f559b95e2883c32d20d309d316f0572fd84b5
treed3f56d73ea1752f1377991d74cf34fed50f275c9
parent315342ffedf6b81f629c42e87bfaedbcc7211646
Fix jsonb_object_agg crash after eliminating null-valued pairs.

In commit b61aa76e4 I added an assumption in jsonb_object_agg_finalfn
that it'd be okay to apply uniqueifyJsonbObject repeatedly to a
JsonbValue.  I should have studied that code more closely first,
because in skip_nulls mode it removed leading nulls by changing the
"pairs" array start pointer.  This broke the data structure's
invariants in two ways: pairs no longer references a repalloc-able
chunk, and the distance from pairs to the end of its array is less
than parseState->size.  So any subsequent addition of more pairs is
at high risk of clobbering memory and/or causing repalloc to crash.
Unfortunately, adding more pairs is exactly what will happen when the
aggregate is being used as a window function.

Fix by rewriting uniqueifyJsonbObject to not do that.  The prior
coding had little to recommend it anyway.

Reported-by: Alexander Lakhin <[email protected]>
Author: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/ec5e96fb-ee49-4e5f-8a09-3f72b4780538@gmail.com
src/backend/utils/adt/jsonb.c
src/backend/utils/adt/jsonb_util.c
src/test/regress/expected/jsonb.out
src/test/regress/sql/jsonb.sql