Commits

Thomas Heller committed 91ca6ee

Fix a potential segfault and various potentail refcount leaks
in the cast() function.

  • Participants
  • Parent commits 82b6757
  • Branches legacy-trunk

Comments (0)

Files changed (1)

File Modules/_ctypes/_ctypes.c

 		if (obj->b_objects == Py_None) {
 			Py_DECREF(Py_None);
 			obj->b_objects = PyDict_New();
-			if (!obj->b_objects) {
-				Py_DECREF(result);
-				return NULL;
-			}
+			if (obj->b_objects == NULL)
+				goto failed;
 		}
-		/* XXX(nnorwitz): shouldn't the INCREF only be done in an else? */
-		Py_INCREF(obj->b_objects);
 		result->b_objects = obj->b_objects;
 		if (result->b_objects) {
-			PyObject *index = PyLong_FromVoidPtr((void *)src);
+			PyObject *index;
 			int rc;
-			if (index == NULL) {
-				Py_DECREF(result);
-				return NULL;
-			}
+			Py_INCREF(obj->b_objects);
+			index = PyLong_FromVoidPtr((void *)src);
+			if (index == NULL)
+				goto failed;
 			rc = PyDict_SetItem(result->b_objects, index, src);
 			Py_DECREF(index);
-			if (rc == -1) {
-				Py_DECREF(result);
-				return NULL;
-			}
+			if (rc == -1)
+				goto failed;
 		}
 	}
 	/* Should we assert that result is a pointer type? */
 	memcpy(result->b_ptr, &ptr, sizeof(void *));
 	return (PyObject *)result;
+
+  failed:
+	Py_DECREF(result);
+	return NULL;
 }
 
 #ifdef CTYPES_UNICODE