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