Don't leak the temporary PLyProcedure struct we create for inline plpython

blocks.

Investigation by Jan Urbański, though I didn't use his patch.
This commit is contained in:
Heikki Linnakangas 2011-03-31 12:37:11 +03:00
parent 647f8b3dba
commit ec7626504f
1 changed files with 9 additions and 9 deletions

View File

@ -592,7 +592,7 @@ plpython_inline_handler(PG_FUNCTION_ARGS)
FunctionCallInfoData fake_fcinfo; FunctionCallInfoData fake_fcinfo;
FmgrInfo flinfo; FmgrInfo flinfo;
PLyProcedure *save_curr_proc; PLyProcedure *save_curr_proc;
PLyProcedure *volatile proc = NULL; PLyProcedure proc;
ErrorContextCallback plerrcontext; ErrorContextCallback plerrcontext;
if (SPI_connect() != SPI_OK_CONNECT) if (SPI_connect() != SPI_OK_CONNECT)
@ -613,26 +613,26 @@ plpython_inline_handler(PG_FUNCTION_ARGS)
flinfo.fn_oid = InvalidOid; flinfo.fn_oid = InvalidOid;
flinfo.fn_mcxt = CurrentMemoryContext; flinfo.fn_mcxt = CurrentMemoryContext;
proc = PLy_malloc0(sizeof(PLyProcedure)); MemSet(&proc, 0, sizeof(PLyProcedure));
proc->pyname = PLy_strdup("__plpython_inline_block"); proc.pyname = PLy_strdup("__plpython_inline_block");
proc->result.out.d.typoid = VOIDOID; proc.result.out.d.typoid = VOIDOID;
PG_TRY(); PG_TRY();
{ {
PLy_procedure_compile(proc, codeblock->source_text); PLy_procedure_compile(&proc, codeblock->source_text);
PLy_curr_procedure = proc; PLy_curr_procedure = &proc;
PLy_function_handler(&fake_fcinfo, proc); PLy_function_handler(&fake_fcinfo, &proc);
} }
PG_CATCH(); PG_CATCH();
{ {
PLy_procedure_delete(proc); PLy_procedure_delete(&proc);
PLy_curr_procedure = save_curr_proc; PLy_curr_procedure = save_curr_proc;
PyErr_Clear(); PyErr_Clear();
PG_RE_THROW(); PG_RE_THROW();
} }
PG_END_TRY(); PG_END_TRY();
PLy_procedure_delete(proc); PLy_procedure_delete(&proc);
/* Pop the error context stack */ /* Pop the error context stack */
error_context_stack = plerrcontext.previous; error_context_stack = plerrcontext.previous;