1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-18 12:22:09 +03:00

Fix three Python reference leaks in PLy_traceback(). This would result

in leaking memory when invoking a PL/Python procedure that raises an
exception. Unfortunately this still leaks memory, but at least the
largest leak has been plugged.

This patch also fixes a reference counting mistake in PLy_modify_tuple()
for 8.0, 8.1 and HEAD: we don't actually own a reference to `platt', so
we shouldn't Py_DECREF() it.
This commit is contained in:
Neil Conway
2006-02-20 20:10:43 +00:00
parent 74f615766c
commit 8ac04d4d78

View File

@@ -29,7 +29,7 @@
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.58.4.5 2006/01/17 17:33:37 tgl Exp $ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.58.4.6 2006/02/20 20:10:43 neilc Exp $
* *
********************************************************************* *********************************************************************
*/ */
@@ -548,7 +548,6 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
{ {
Py_XDECREF(plntup); Py_XDECREF(plntup);
Py_XDECREF(plkeys); Py_XDECREF(plkeys);
Py_XDECREF(platt);
Py_XDECREF(plval); Py_XDECREF(plval);
Py_XDECREF(plstr); Py_XDECREF(plstr);
@@ -1080,7 +1079,7 @@ PLy_procedure_create(FunctionCallInfo fcinfo, Oid tgreloid,
/* /*
* now get information required for input conversion of the * now get information required for input conversion of the
* procedures arguments. * procedure's arguments.
*/ */
proc->nargs = fcinfo->nargs; proc->nargs = fcinfo->nargs;
for (i = 0; i < fcinfo->nargs; i++) for (i = 0; i < fcinfo->nargs; i++)
@@ -2539,6 +2538,7 @@ PLy_traceback(int *xlevel)
} }
PyErr_NormalizeException(&e, &v, &tb); PyErr_NormalizeException(&e, &v, &tb);
Py_XDECREF(tb);
eob = PyObject_Str(e); eob = PyObject_Str(e);
if ((v) && ((vob = PyObject_Str(v)) != NULL)) if ((v) && ((vob = PyObject_Str(v)) != NULL))
@@ -2557,9 +2557,10 @@ PLy_traceback(int *xlevel)
Py_DECREF(eob); Py_DECREF(eob);
Py_XDECREF(vob); Py_XDECREF(vob);
Py_XDECREF(v);
/* /*
* intuit an appropriate error level for based on the exception type * intuit an appropriate error level based on the exception type
*/ */
if ((PLy_exc_error) && (PyErr_GivenExceptionMatches(e, PLy_exc_error))) if ((PLy_exc_error) && (PyErr_GivenExceptionMatches(e, PLy_exc_error)))
*xlevel = ERROR; *xlevel = ERROR;
@@ -2568,6 +2569,7 @@ PLy_traceback(int *xlevel)
else else
*xlevel = ERROR; *xlevel = ERROR;
Py_XDECREF(e);
return xstr; return xstr;
} }