1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-27 23:21:58 +03:00

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
This commit is contained in:
Peter Eisentraut
2010-08-25 19:37:43 +00:00
parent 9005604c65
commit fbd7353bdc

View File

@ -1,7 +1,7 @@
/********************************************************************** /**********************************************************************
* plpython.c - python as a procedural language for PostgreSQL * 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"); elog(FATAL, "expected a PyCObject, didn't get one");
proc = PyCObject_AsVoidPtr(plproc); proc = PyCObject_AsVoidPtr(plproc);
if (!proc)
PLy_elog(ERROR, "PyCObject_AsVoidPtr() failed");
if (proc->me != plproc) if (proc->me != plproc)
elog(FATAL, "proc->me != plproc"); elog(FATAL, "proc->me != plproc");
/* did we find an up-to-date cache entry? */ /* 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); PLy_procedure_compile(proc, procSource);
pfree(procSource); pfree(procSource);
procSource = NULL;
proc->me = PyCObject_FromVoidPtr(proc, NULL); proc->me = PyCObject_FromVoidPtr(proc, NULL);
if (!proc->me)
PLy_elog(ERROR, "PyCObject_FromVoidPtr() failed");
PyDict_SetItemString(PLy_procedure_cache, key, proc->me); PyDict_SetItemString(PLy_procedure_cache, key, proc->me);
} }
PG_CATCH(); PG_CATCH();