[Python-checkins] cpython: Issue #19437: Fix ctypes, handle PyCData_GetContainer() and GetKeepedObjects()

victor.stinner python-checkins at python.org
Wed Nov 13 13:33:32 CET 2013


http://hg.python.org/cpython/rev/13203ea0ac5b
changeset:   87082:13203ea0ac5b
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Nov 13 13:29:37 2013 +0100
summary:
  Issue #19437: Fix ctypes, handle PyCData_GetContainer() and GetKeepedObjects()
failures

files:
  Modules/_ctypes/_ctypes.c |  20 +++++++++++++++++++-
  1 files changed, 19 insertions(+), 1 deletions(-)


diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -2405,6 +2405,10 @@
         return 0;
     }
     ob = PyCData_GetContainer(target);
+    if (ob == NULL) {
+        Py_DECREF(keep);
+        return -1;
+    }
     if (ob->b_objects == NULL || !PyDict_CheckExact(ob->b_objects)) {
         Py_XDECREF(ob->b_objects);
         ob->b_objects = keep; /* refcount consumed */
@@ -2791,6 +2795,9 @@
             /* XXX */;
 
         value = GetKeepedObjects(src);
+        if (value == NULL)
+            return NULL;
+
         Py_INCREF(value);
         return value;
     }
@@ -2814,6 +2821,9 @@
         *(void **)ptr = src->b_ptr;
 
         keep = GetKeepedObjects(src);
+        if (keep == NULL)
+            return NULL;
+
         /*
           We are assigning an array object to a field which represents
           a pointer. This has the same effect as converting an array
@@ -4810,6 +4820,9 @@
         return -1;
 
     keep = GetKeepedObjects(dst);
+    if (keep == NULL)
+        return -1;
+
     Py_INCREF(keep);
     return KeepRef(self, 0, keep);
 }
@@ -5216,9 +5229,14 @@
      */
     if (CDataObject_Check(src)) {
         CDataObject *obj = (CDataObject *)src;
+        CDataObject *container;
+
         /* PyCData_GetContainer will initialize src.b_objects, we need
            this so it can be shared */
-        PyCData_GetContainer(obj);
+        container = PyCData_GetContainer(obj);
+        if (container == NULL)
+            goto failed;
+
         /* But we need a dictionary! */
         if (obj->b_objects == Py_None) {
             Py_DECREF(Py_None);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list