aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2010-08-25 19:37:39 +0000
committerPeter Eisentraut <peter_e@gmx.net>2010-08-25 19:37:39 +0000
commitb64f3bcf726ab945ff9431322f8ebbea51366eef (patch)
tree546bce52f5b6bfce7d79ea54afc5cce83ebec5cd
parentf7f92b3fa45f309cf545783bd0a32af0709f1357 (diff)
downloadpostgresql-b64f3bcf726ab945ff9431322f8ebbea51366eef.tar.gz
postgresql-b64f3bcf726ab945ff9431322f8ebbea51366eef.zip
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
-rw-r--r--src/pl/plpython/plpython.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 58c02001d9a..63ad15e7afa 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.90.2.7 2010/04/30 19:16:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.90.2.8 2010/08/25 19:37:39 petere Exp $
*
*********************************************************************
*/
@@ -1099,6 +1099,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? */
@@ -1301,8 +1303,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();