]> granicus.if.org Git - postgresql/commitdiff
Don't leak the temporary PLyProcedure struct we create for inline plpython
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 31 Mar 2011 09:37:11 +0000 (12:37 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
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;