Re: [PATCH] Fix segmentation fault and infinite loop in jsonb_{plperl,plpython}
Aleksander Alekseev <aleksander@tigerdata.com>
From: Aleksander Alekseev <aleksander@tigerdata.com>
To: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2026-06-16T21:03:12Z
Lists: pgsql-hackers
Hi Tom, Thanks for taking a look. > > 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. That's funny :) > 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. Alternatively I could implement a check for the loops, if you feel like this is worth the effort. -- Best regards, Aleksander Alekseev
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