aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Conway <neilc@samurai.com>2006-02-20 20:10:41 +0000
committerNeil Conway <neilc@samurai.com>2006-02-20 20:10:41 +0000
commit797deb5092d1ee58b843a3b428b21981648a82b5 (patch)
tree978a8b579cb79670d555b215d2fe44e4b61ae740
parent3bd549ba0a33a4cd71431e6b65aec3447a0e61c3 (diff)
downloadpostgresql-797deb5092d1ee58b843a3b428b21981648a82b5.tar.gz
postgresql-797deb5092d1ee58b843a3b428b21981648a82b5.zip
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.
-rw-r--r--src/pl/plpython/plpython.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index e9b9c5958d7..da78a46f62b 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -29,7 +29,7 @@
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.66.2.3 2006/01/17 17:33:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.66.2.4 2006/02/20 20:10:41 neilc Exp $
*
*********************************************************************
*/
@@ -549,7 +549,6 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
{
Py_XDECREF(plntup);
Py_XDECREF(plkeys);
- Py_XDECREF(platt);
Py_XDECREF(plval);
Py_XDECREF(plstr);
@@ -1080,7 +1079,7 @@ PLy_procedure_create(FunctionCallInfo fcinfo, Oid tgreloid,
}
/*
- * now get information required for input conversion of the procedures
+ * now get information required for input conversion of the procedure's
* arguments.
*/
proc->nargs = fcinfo->nargs;
@@ -2537,6 +2536,7 @@ PLy_traceback(int *xlevel)
}
PyErr_NormalizeException(&e, &v, &tb);
+ Py_XDECREF(tb);
eob = PyObject_Str(e);
if ((v) && ((vob = PyObject_Str(v)) != NULL))
@@ -2555,9 +2555,10 @@ PLy_traceback(int *xlevel)
Py_DECREF(eob);
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)))
*xlevel = ERROR;
@@ -2566,6 +2567,7 @@ PLy_traceback(int *xlevel)
else
*xlevel = ERROR;
+ Py_DECREF(e);
return xstr;
}