pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Don't corrupt plpython's "TD" dictionary in a recursive trigger
Date: Tue, 07 May 2024 22:15:22 +0000
Message-ID: <E1s4T5l-0023uq-0k@gemulon.postgresql.org> (raw)

Don't corrupt plpython's "TD" dictionary in a recursive trigger call.

If a plpython-language trigger caused another one to be invoked,
the "TD" dictionary created for the inner one would overwrite the
outer one's "TD" dictionary.  This is more or less the same problem
that 1d2fe56e4 fixed for ordinary functions in plpython, so fix it
the same way, by saving and restoring "TD" during a recursive
invocation.

This fix makes an ABI-incompatible change in struct PLySavedArgs.
I'm not too worried about that because it seems highly unlikely that
any extension is messing with those structs.  We could imagine doing
something weird to preserve nominal ABI compatibility in the back
branches, like keeping the saved TD object in an extra element of
namedargs[].  However, that would only be very nominal compatibility:
if anything *is* touching PLySavedArgs, it would likely do the wrong
thing due to not knowing about the additional value.  So I judge it
not worth the ugliness to do something different there.

(I also changed struct PLyProcedure, but its added field fits
into formerly-padding space, so that should be safe.)

Per bug #18456 from Jacques Combrink.  This bug is very ancient,
so back-patch to all supported branches.

Discussion: https://postgr.es/m/3008982.1714853799@sss.pgh.pa.us

Branch
------
REL_15_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/363e8c2f98b80e039873902b3b3fd003ae09bd9e

Modified Files
--------------
src/pl/plpython/expected/plpython_trigger.out | 27 +++++++++++++++++++++++++
src/pl/plpython/plpy_exec.c                   | 29 ++++++++++++++++++++++++---
src/pl/plpython/plpy_procedure.c              |  1 +
src/pl/plpython/plpy_procedure.h              |  2 ++
src/pl/plpython/sql/plpython_trigger.sql      | 24 ++++++++++++++++++++++
5 files changed, 80 insertions(+), 3 deletions(-)



view thread (6+ messages)  latest in thread

Message-ID: <E1s4T5l-0023uq-0k@gemulon.postgresql.org>
Permalink:  ../E1s4T5l-0023uq-0k@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1s4T5l-0023uq-0k@gemulon.postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: tgl@sss.pgh.pa.us, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Don't corrupt plpython's "TD" dictionary in a recursive trigger
  In-Reply-To: <E1s4T5l-0023uq-0k@gemulon.postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox