[PATCH] fix segfault with DO and plperl/plperlu

Started by Alex Hunsakerover 15 years ago3 messages
#1Alex Hunsaker
badalex@gmail.com
1 attachment(s)

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;

Attachments:

fix_do_plperl_plperlu.patchtext/x-patch; charset=US-ASCII; name=fix_do_plperl_plperlu.patchDownload
*** 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;
  
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alex Hunsaker (#1)
Re: [PATCH] fix segfault with DO and plperl/plperlu

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

#3Alex Hunsaker
badalex@gmail.com
In reply to: Tom Lane (#2)
Re: [PATCH] fix segfault with DO and plperl/plperlu

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!