Fix edge-case resource leaks in PL/Python error reporting.
authorTom Lane <[email protected]>
Sun, 1 Jun 2025 18:48:35 +0000 (14:48 -0400)
committerTom Lane <[email protected]>
Sun, 1 Jun 2025 18:48:35 +0000 (14:48 -0400)
commit31a3a15fa49d5a433ed076c687db01affa39f65c
tree35fbe60682e72e05be2f8d844148378f39b2fb24
parentb65be6ef00e2bfad7317cc32e33333e8f3a26642
Fix edge-case resource leaks in PL/Python error reporting.

PLy_elog_impl and its subroutine PLy_traceback intended to avoid
leaking any PyObject reference counts, but their coverage of the
matter was sadly incomplete.  In particular, out-of-memory errors
in most of the string-construction subroutines could lead to
reference count leaks, because those calls were outside the
PG_TRY blocks responsible for dropping reference counts.

Fix by (a) adjusting the scopes of the PG_TRY blocks, and
(b) moving the responsibility for releasing the reference counts
of the traceback-stack objects to PLy_elog_impl.  This requires
some additional "volatile" markers, but not too many.

In passing, fix an ancient thinko: use of the "e_module_o" PyObject
was guarded by "if (e_type_s)", where surely "if (e_module_o)"
was meant.  This would only have visible consequences if the
"__name__" attribute were present but the "__module__" attribute
wasn't, which apparently never happens; but someday it might.

Rearranging the PG_TRY blocks requires indenting a fair amount
of code one more tab stop, which I'll do separately for clarity.

Author: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/2954090.1748723636@sss.pgh.pa.us
Backpatch-through: 13
src/pl/plpython/plpy_elog.c