From fbd7353bdcc41357820ab05faf67c6454b4577c9 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 25 Aug 2010 19:37:43 +0000 Subject: [PATCH] Catch null pointer returns from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr This is reproducibly possible in Python 2.7 if the user turned PendingDeprecationWarning into an error, but it's theoretically also possible in earlier versions in case of exceptional conditions. backpatched to 8.0 --- src/pl/plpython/plpython.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c index 3d422eb7e8a..b4d37f508ad 100644 --- a/src/pl/plpython/plpython.c +++ b/src/pl/plpython/plpython.c @@ -1,7 +1,7 @@ /********************************************************************** * plpython.c - python as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.106.2.3 2010/04/30 19:15:58 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.106.2.4 2010/08/25 19:37:43 petere Exp $ * ********************************************************************* */ @@ -1112,6 +1112,8 @@ PLy_procedure_get(FunctionCallInfo fcinfo, Oid tgreloid) elog(FATAL, "expected a PyCObject, didn't get one"); proc = PyCObject_AsVoidPtr(plproc); + if (!proc) + PLy_elog(ERROR, "PyCObject_AsVoidPtr() failed"); if (proc->me != plproc) elog(FATAL, "proc->me != plproc"); /* did we find an up-to-date cache entry? */ @@ -1314,8 +1316,11 @@ PLy_procedure_create(HeapTuple procTup, Oid tgreloid, char *key) PLy_procedure_compile(proc, procSource); pfree(procSource); + procSource = NULL; proc->me = PyCObject_FromVoidPtr(proc, NULL); + if (!proc->me) + PLy_elog(ERROR, "PyCObject_FromVoidPtr() failed"); PyDict_SetItemString(PLy_procedure_cache, key, proc->me); } PG_CATCH();