From: Tom Lane Date: Thu, 18 Jun 2026 16:22:55 +0000 (-0400) Subject: hstore_plperl: Add CHECK_FOR_INTERRUPTS() in reference-unwinding loop. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c0f17b04d9069cdfd0631b86c776be13192dbe1d;p=thirdparty%2Fpostgresql.git hstore_plperl: Add CHECK_FOR_INTERRUPTS() in reference-unwinding loop. Add CHECK_FOR_INTERRUPTS() to the while loop in plperl_to_hstore() that dereferences chains of Perl references, so that a circular reference (e.g. $x = \$x) can be cancelled by the user instead of spinning indefinitely. (We looked at detecting such circular references, but it seems more trouble than it's worth.) This is a follow-up to da82fbb8f, which fixed the same issue in SV_to_JsonbValue() in jsonb_plperl. Author: Aleksander Alekseev Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CAJ7c6TPbjkzUk4qJ5dHvDNEz0hBuFue3A-XWz_=897z+BC+z8A@mail.gmail.com Backpatch-through: 14 --- diff --git a/contrib/hstore_plperl/hstore_plperl.c b/contrib/hstore_plperl/hstore_plperl.c index 996b46b148d..336ead65a18 100644 --- a/contrib/hstore_plperl/hstore_plperl.c +++ b/contrib/hstore_plperl/hstore_plperl.c @@ -2,6 +2,7 @@ #include "fmgr.h" #include "hstore/hstore.h" +#include "miscadmin.h" #include "plperl.h" PG_MODULE_MAGIC_EXT( @@ -111,7 +112,15 @@ plperl_to_hstore(PG_FUNCTION_ARGS) /* Dereference references recursively. */ while (SvROK(in)) + { + /* + * It's possible for circular references to make this an infinite + * loop. Checking for such a situation seems like much more trouble + * than it's worth, but let's provide a way to break out of the loop. + */ + CHECK_FOR_INTERRUPTS(); in = SvRV(in); + } /* Now we must have a hash. */ if (SvTYPE(in) != SVt_PVHV)