Thread

  1. [PATCH] fix segfault with DO and plperl/plperlu

    Alex Hunsaker <badalex@gmail.com> — 2010-04-18T06:48:41Z

    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;
    
  2. Re: [PATCH] fix segfault with DO and plperl/plperlu

    Tom Lane <tgl@sss.pgh.pa.us> — 2010-04-18T19:17:39Z

    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
    
    
  3. Re: [PATCH] fix segfault with DO and plperl/plperlu

    Alex Hunsaker <badalex@gmail.com> — 2010-04-18T21:04:22Z

    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!