Re: [PATCH] Fix segmentation fault and infinite loop in jsonb_{plperl,plpython}
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Aleksander Alekseev <aleksander@tigerdata.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2026-06-16T20:03:28Z
Lists: pgsql-hackers
Aleksander Alekseev <aleksander@tigerdata.com> writes: > The second bug affects only jsonb_plperl. It's possible to construct a > Perl object with circular references which will cause > SV_to_JsonbValue() to go into an infinite loop here: > while (SvROK(in)) > in = SvRV(in); > I suggest fixing it by rewriting the while loop into a recursion with > check_stack_depth() call. This will make the behavior consistent with > jsonb_plpython. Unfortunately, your 0002 is too cute for its own good. I tried it here, with a not-especially-new gcc compiling at -O2, and found that the tail recursion in SV_deref() is optimized into a loop. So the stack doesn't grow and we still have an uninterruptible loop. I don't immediately see a way to write that function so that the compiler is certain not to spot the tail recursion. Tricks like two mutually recursive functions might be seen through at sufficiently high -O levels. We could instead add a CHECK_FOR_INTERRUPTS, so that you can at least break out of the infinite loop. I'm not sure if the case is worth more effort than that. regards, tom lane
Commits
-
hstore_plperl: Add CHECK_FOR_INTERRUPTS() in reference-unwinding loop.
- c0f17b04d906 19 (unreleased) landed
- d65cf6f800f0 18 (unreleased) landed
- 60a1d712a472 16 (unreleased) landed
- 4fbbabb0a729 15 (unreleased) landed
- 4efef9d18e63 17 (unreleased) landed
- 1f6b2295f952 14 (unreleased) landed
-
jsonb_plperl, jsonb_plpython: Fix unguarded recursion and loops.
- e3b7a43fa9b6 18 (unreleased) landed
- da82fbb8f9a3 19 (unreleased) landed
- b0f3465b6f6a 16 (unreleased) landed
- a6f23c3ade0e 15 (unreleased) landed
- 639fff5118a8 14 (unreleased) landed
- 3df0b77558d7 17 (unreleased) landed