Don't leak the temporary PLyProcedure struct we create for inline plpython
authorHeikki Linnakangas
Thu, 31 Mar 2011 09:37:11 +0000 (12:37 +0300)
committerHeikki Linnakangas
Thu, 31 Mar 2011 09:37:11 +0000 (12:37 +0300)
blocks.

Investigation by Jan Urbański, though I didn't use his patch.

src/pl/plpython/plpython.c

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