Catch null pointer returns from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr
authorPeter Eisentraut <[email protected]>
Wed, 25 Aug 2010 19:37:30 +0000 (19:37 +0000)
committerPeter Eisentraut <[email protected]>
Wed, 25 Aug 2010 19:37:30 +0000 (19:37 +0000)
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

index 20ec1f8047b80f289bf800dc521969bc00947108..e75c8c38071a19fafffde1a5142ef7ff0289afbe 100644 (file)
@@ -29,7 +29,7 @@
  * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
  * IDENTIFICATION
- *     $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.58.4.11 2010/04/30 19:16:19 tgl Exp $
+ *     $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.58.4.12 2010/08/25 19:37:30 petere Exp $
  *
  *********************************************************************
  */
@@ -966,6 +966,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? */
@@ -1135,8 +1137,11 @@ PLy_procedure_create(FunctionCallInfo fcinfo, Oid tgreloid,
                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();