[Python-checkins] r51018 - python/trunk/Modules/_ctypes/_ctypes.c

thomas.heller python-checkins at python.org
Tue Aug 1 18:54:45 CEST 2006


Author: thomas.heller
Date: Tue Aug  1 18:54:43 2006
New Revision: 51018

Modified:
   python/trunk/Modules/_ctypes/_ctypes.c
Log:
Fix a potential segfault and various potentail refcount leaks
in the cast() function.

Modified: python/trunk/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/trunk/Modules/_ctypes/_ctypes.c	(original)
+++ python/trunk/Modules/_ctypes/_ctypes.c	Tue Aug  1 18:54:43 2006
@@ -4521,32 +4521,30 @@
 		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


More information about the Python-checkins mailing list