summaryrefslogtreecommitdiffstats
path: root/Modules/_ctypes
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2006-08-18 14:38:46 (GMT)
committerThomas Heller <theller@ctypes.org>2006-08-18 14:38:46 (GMT)
commit0b21b43d491220ae51eebc4df9ba6cf616265c7c (patch)
tree48850986524b0033e6d85ef9fca1f4f48072454a /Modules/_ctypes
parentc458433850348500ac8139ffca36a251ebc5b8ae (diff)
downloadcpython-0b21b43d491220ae51eebc4df9ba6cf616265c7c.zip
cpython-0b21b43d491220ae51eebc4df9ba6cf616265c7c.tar.gz
cpython-0b21b43d491220ae51eebc4df9ba6cf616265c7c.tar.bz2
Add asserts to check for 'impossible' NULL values, with comments.
In one place where I'n not 1000% sure about the non-NULL, raise a RuntimeError for safety. This should fix the klocwork issues that Neal sent me. If so, it should be applied to the release25-maint branch also.
Diffstat (limited to 'Modules/_ctypes')
-rw-r--r--Modules/_ctypes/_ctypes.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index ab83f8c..5204a7f 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -672,6 +672,7 @@ PointerType_from_param(PyObject *type, PyObject *value)
return PyInt_FromLong(0); /* NULL pointer */
typedict = PyType_stgdict(type);
+ assert(typedict); /* Cannot be NULL for pointer types */
/* If we expect POINTER(<type>), but receive a <type> instance, accept
it by calling byref(<type>).
@@ -3129,6 +3130,13 @@ _build_callargs(CFuncPtrObject *self, PyObject *argtypes,
}
ob = PyTuple_GET_ITEM(argtypes, i);
dict = PyType_stgdict(ob);
+ if (dict == NULL) {
+ /* Cannot happen: _validate_paramflags()
+ would not accept such an object */
+ PyErr_Format(PyExc_RuntimeError,
+ "NULL stgdict unexpected");
+ goto error;
+ }
if (PyString_Check(dict->proto)) {
PyErr_Format(
PyExc_TypeError,
@@ -3726,6 +3734,8 @@ Array_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh)
assert(stgdict); /* Cannot be NULL for array object instances */
proto = stgdict->proto;
itemdict = PyType_stgdict(proto);
+ assert(itemdict); /* proto is the item type of the array, a ctypes
+ type, so this cannot be NULL */
if (itemdict->getfunc == getentry("c")->getfunc) {
char *ptr = (char *)self->b_ptr;
return PyString_FromStringAndSize(ptr + ilow, len);
@@ -4159,6 +4169,9 @@ Pointer_item(PyObject *_self, Py_ssize_t index)
proto = stgdict->proto;
assert(proto);
itemdict = PyType_stgdict(proto);
+ assert(itemdict); /* proto is the item type of the pointer, a ctypes
+ type, so this cannot be NULL */
+
size = itemdict->size;
offset = index * itemdict->size;
@@ -4194,6 +4207,9 @@ Pointer_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value)
assert(proto);
itemdict = PyType_stgdict(proto);
+ assert(itemdict); /* Cannot be NULL because the itemtype of a pointer
+ is always a ctypes type */
+
size = itemdict->size;
offset = index * itemdict->size;