pgsql: Fix jsonb subscripting to cope with toasted subscript values.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix jsonb subscripting to cope with toasted subscript values.
Date: 2022-12-12 21:18:02
Message-ID: E1p4qBV-003GQG-DN@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix jsonb subscripting to cope with toasted subscript values.

jsonb_get_element() was incautious enough to use VARDATA() and
VARSIZE() directly on an arbitrary text Datum. That of course
fails if the Datum is short-header, compressed, or out-of-line.
The typical result would be failing to match any element of a
jsonb object, though matching the wrong one seems possible as well.

setPathObject() was slightly brighter, in that it used VARDATA_ANY
and VARSIZE_ANY_EXHDR, but that only kept it out of trouble for
short-header Datums. push_path() had the same issue. This could
result in faulty subscripted insertions, though keys long enough to
cause a problem are likely rare in the wild.

Having seen these, I looked around for unsafe usages in the rest
of the adt/json* files. There are a couple of places where it's not
immediately obvious that the Datum can't be compressed or out-of-line,
so I added pg_detoast_datum_packed() to cope if it is. Also, remove
some other usages of VARDATA/VARSIZE on Datums we just extracted from
a text array. Those aren't actively broken, but they will become so
if we ever start allowing short-header array elements, which does not
seem like a terribly unreasonable thing to do. In any case they are
not great coding examples, and they could also do with comments
pointing out that we're assuming we don't need pg_detoast_datum_packed.

Per report from exe-dealer(at)yandex(dot)ru(dot) Patch by me, but thanks to
David Johnston for initial investigation. Back-patch to v14 where
jsonb subscripting was introduced.

Discussion: https://postgr.es/m/205321670615953@mail.yandex.ru

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/b0feda79fdf02710a6039a324299525845a4a9d4

Modified Files
--------------
src/backend/utils/adt/jsonb_gin.c | 5 +++--
src/backend/utils/adt/jsonb_op.c | 10 +++++----
src/backend/utils/adt/jsonfuncs.c | 41 ++++++++++++++++++++++++++-----------
src/test/regress/expected/jsonb.out | 34 ++++++++++++++++++++++++++++++
src/test/regress/sql/jsonb.sql | 18 ++++++++++++++++
5 files changed, 90 insertions(+), 18 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2022-12-13 06:53:12 pgsql: Refactor ExecGrant_*() functions
Previous Message Thomas Munro 2022-12-12 21:16:39 pgsql: Disable clang 16's -Wcast-function-type-strict.