Thread: [PATCH] fix segfault with DO and plperl/plperlu

[PATCH] fix segfault with DO and plperl/plperlu

From
Alex Hunsaker
Date:
If you do:

# DO $do$ 1; $do$ LANGUAGE plperlu;
# DO $do$ 1; $do$ LANGUAGE plperl;

You get a segfault as we try to SvREFCNT_dec(...); for the wrong
interpreter.  To fix push down the restore_context() so that we do the
above on the correct perl interpreter.
--
 *** a/src/pl/plperl/plperl.c
--- b/src/pl/plperl/plperl.c
***************
*** 1154,1170 **** plperl_inline_handler(PG_FUNCTION_ARGS)
      PG_CATCH();
      {
          current_call_data = save_call_data;
-         restore_context(oldcontext);
          if (desc.reference)
              SvREFCNT_dec(desc.reference);
          PG_RE_THROW();
      }
      PG_END_TRY();

      current_call_data = save_call_data;
-     restore_context(oldcontext);
      if (desc.reference)
          SvREFCNT_dec(desc.reference);

      error_context_stack = pl_error_context.previous;

--- 1154,1170 ----
      PG_CATCH();
      {
          current_call_data = save_call_data;
          if (desc.reference)
              SvREFCNT_dec(desc.reference);
+         restore_context(oldcontext);
          PG_RE_THROW();
      }
      PG_END_TRY();

      current_call_data = save_call_data;
      if (desc.reference)
          SvREFCNT_dec(desc.reference);
+     restore_context(oldcontext);

      error_context_stack = pl_error_context.previous;

Attachment

Re: [PATCH] fix segfault with DO and plperl/plperlu

From
Tom Lane
Date:
Alex Hunsaker <badalex@gmail.com> writes:
> If you do:
> # DO $do$ 1; $do$ LANGUAGE plperlu;
> # DO $do$ 1; $do$ LANGUAGE plperl;

> You get a segfault as we try to SvREFCNT_dec(...); for the wrong
> interpreter.  To fix push down the restore_context() so that we do the
> above on the correct perl interpreter.

Hmm.  I don't see a segfault on my machine, but I agree that this looks
bogus.  I changed it to this order instead:
    if (desc.reference)        SvREFCNT_dec(desc.reference);    current_call_data = save_call_data;
restore_context(oldcontext);

so as to keep the "state restore" operations together.
        regards, tom lane


Re: [PATCH] fix segfault with DO and plperl/plperlu

From
Alex Hunsaker
Date:
On Sun, Apr 18, 2010 at 13:17, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Alex Hunsaker <badalex@gmail.com> writes:
>> You get a segfault as we try to SvREFCNT_dec(...);
>
> Hmm.  I don't see a segfault on my machine, but I agree that this looks
> bogus.  I changed it to this order instead:
> [ ... ]
> so as to keep the "state restore" operations together.

Even better Thanks!