diff -r 579141d6e353 Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c Tue Sep 13 09:38:29 2016 +0200 +++ b/Modules/_ctypes/_ctypes.c Tue Sep 13 13:31:32 2016 +0300 @@ -463,7 +463,11 @@ Py_ssize_t offset = 0; StgDictObject *dict = PyType_stgdict(type); - assert (dict); + if (!dict) { + PyErr_SetString(PyExc_TypeError, + "abstract class"); + return NULL; + } if (!PyArg_ParseTuple(args, "O|n:from_buffer", &obj, &offset)) return NULL; @@ -531,7 +535,11 @@ Py_ssize_t offset = 0; PyObject *result; StgDictObject *dict = PyType_stgdict(type); - assert (dict); + if (!dict) { + PyErr_SetString(PyExc_TypeError, + "abstract class"); + return NULL; + } if (!PyArg_ParseTuple(args, "y*|n:from_buffer", &buffer, &offset)) return NULL; @@ -920,6 +928,7 @@ if (proto) { StgDictObject *itemdict = PyType_stgdict(proto); const char *current_format; + /* PyCPointerType_SetProto has verified proto has a stgdict. */ assert(itemdict); /* If itemdict->format is NULL, then this is a pointer to an incomplete type. We create a generic format string @@ -966,7 +975,11 @@ StgDictObject *dict; dict = PyType_stgdict((PyObject *)self); - assert(dict); + if (!dict) { + PyErr_SetString(PyExc_TypeError, + "abstract class"); + return NULL; + } if (-1 == PyCPointerType_SetProto(dict, type)) return NULL; @@ -992,7 +1005,11 @@ } typedict = PyType_stgdict(type); - assert(typedict); /* Cannot be NULL for pointer types */ + if (!typedict) { + PyErr_SetString(PyExc_TypeError, + "abstract class"); + return NULL; + } /* If we expect POINTER(), but receive a instance, accept it by calling byref(). @@ -2057,7 +2074,11 @@ } dict = PyType_stgdict(type); - assert(dict); + if (!dict) { + PyErr_SetString(PyExc_TypeError, + "abstract class"); + return NULL; + } /* I think we can rely on this being a one-character string */ fmt = _PyUnicode_AsString(dict->proto); @@ -3151,7 +3172,11 @@ PyObject *argtypes; dict = PyType_stgdict((PyObject *)type); - assert(dict); /* Cannot be NULL. 'type' is a PyCFuncPtr type. */ + if (!dict) { + PyErr_SetString(PyExc_TypeError, + "abstract class"); + return 0; + } argtypes = dict->argtypes; if (paramflags == NULL || dict->argtypes == NULL) @@ -4784,7 +4809,7 @@ } stgdict = PyObject_stgdict((PyObject *)self); - assert(stgdict); /* Cannot be NULL fr pointer instances */ + assert(stgdict); /* Cannot be NULL for pointer instances */ proto = stgdict->proto; assert(proto); @@ -4812,7 +4837,7 @@ } stgdict = PyObject_stgdict((PyObject *)self); - assert(stgdict); /* Cannot be NULL fr pointer instances */ + assert(stgdict); /* Cannot be NULL for pointer instances */ return PyCData_FromBaseObj(stgdict->proto, (PyObject *)self, 0, *(void **)self->b_ptr); @@ -4831,7 +4856,7 @@ return -1; } stgdict = PyObject_stgdict((PyObject *)self); - assert(stgdict); /* Cannot be NULL fr pointer instances */ + assert(stgdict); /* Cannot be NULL for pointer instances */ assert(stgdict->proto); if (!CDataObject_Check(value)) { int res = PyObject_IsInstance(value, stgdict->proto); diff -r 579141d6e353 Modules/_ctypes/cfield.c --- a/Modules/_ctypes/cfield.c Tue Sep 13 09:38:29 2016 +0200 +++ b/Modules/_ctypes/cfield.c Tue Sep 13 13:31:32 2016 +0300 @@ -205,7 +205,11 @@ { CDataObject *dst; char *ptr; - assert(CDataObject_Check(inst)); + if (!CDataObject_Check(inst)) { + PyErr_SetString(PyExc_TypeError, + "not a ctype instance"); + return -1; + } dst = (CDataObject *)inst; ptr = dst->b_ptr + self->offset; if (value == NULL) { @@ -225,7 +229,11 @@ Py_INCREF(self); return (PyObject *)self; } - assert(CDataObject_Check(inst)); + if (!CDataObject_Check(inst)) { + PyErr_SetString(PyExc_TypeError, + "not a ctype instance"); + return NULL; + } src = (CDataObject *)inst; return PyCData_get(self->proto, self->getfunc, inst, self->index, self->size, src->b_ptr + self->offset);