Catch null pointer returns from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr
authorPeter Eisentraut <[email protected]>
Wed, 25 Aug 2010 19:37:39 +0000 (19:37 +0000)
committerPeter Eisentraut <[email protected]>
Wed, 25 Aug 2010 19:37:39 +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 58c02001d9afcd3fd67ac78d3710db16fb3f9dba..63ad15e7afad4b4316e1805fca1229a4f3c6c20e 100644 (file)
@@ -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();