From d65cf6f800f00a560cd479b426a17f73dd0020f7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 18 Jun 2026 12:22:55 -0400 Subject: [PATCH] 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 --- contrib/hstore_plperl/hstore_plperl.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contrib/hstore_plperl/hstore_plperl.c b/contrib/hstore_plperl/hstore_plperl.c index 2727a5f2ceb..1dd0664508b 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( @@ -110,7 +111,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)