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

  1. hstore_plperl: Add CHECK_FOR_INTERRUPTS() in reference-unwinding loop.

  2. jsonb_plperl, jsonb_plpython: Fix unguarded recursion and loops.