mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
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:
parent
647f8b3dba
commit
ec7626504f
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user