Kaydet (Commit) d32e6167 authored tarafından Thomas Heller's avatar Thomas Heller

Add commented assert statements to check that the result of

PyObject_stgdict() and PyType_stgdict() calls are non-NULL before
dereferencing the result.  Hopefully this fixes what klocwork is
complaining about.

Fix a few other nits as well.
üst a09fd6ef
...@@ -152,7 +152,7 @@ StructUnionType_paramfunc(CDataObject *self) ...@@ -152,7 +152,7 @@ StructUnionType_paramfunc(CDataObject *self)
parg->tag = 'V'; parg->tag = 'V';
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); assert(stgdict); /* Cannot be NULL for structure/union instances */
parg->pffi_type = &stgdict->ffi_type_pointer; parg->pffi_type = &stgdict->ffi_type_pointer;
/* For structure parameters (by value), parg->value doesn't contain the structure /* For structure parameters (by value), parg->value doesn't contain the structure
data itself, instead parg->value.p *points* to the structure's data data itself, instead parg->value.p *points* to the structure's data
...@@ -328,7 +328,6 @@ CDataType_from_param(PyObject *type, PyObject *value) ...@@ -328,7 +328,6 @@ CDataType_from_param(PyObject *type, PyObject *value)
/* If we got a PyCArgObject, we must check if the object packed in it /* If we got a PyCArgObject, we must check if the object packed in it
is an instance of the type's dict->proto */ is an instance of the type's dict->proto */
// if(dict && ob && dict->proto == (PyObject *)ob->ob_type){
if(dict && ob if(dict && ob
&& PyObject_IsInstance(ob, dict->proto)) { && PyObject_IsInstance(ob, dict->proto)) {
Py_INCREF(value); Py_INCREF(value);
...@@ -693,6 +692,7 @@ PointerType_from_param(PyObject *type, PyObject *value) ...@@ -693,6 +692,7 @@ PointerType_from_param(PyObject *type, PyObject *value)
the item types are the same. the item types are the same.
*/ */
StgDictObject *v = PyObject_stgdict(value); StgDictObject *v = PyObject_stgdict(value);
assert(v); /* Cannot be NULL for pointer or array objects */
if (PyObject_IsSubclass(v->proto, typedict->proto)) { if (PyObject_IsSubclass(v->proto, typedict->proto)) {
Py_INCREF(value); Py_INCREF(value);
return value; return value;
...@@ -1154,7 +1154,9 @@ c_wchar_p_from_param(PyObject *type, PyObject *value) ...@@ -1154,7 +1154,9 @@ c_wchar_p_from_param(PyObject *type, PyObject *value)
if (ArrayObject_Check(value) || PointerObject_Check(value)) { if (ArrayObject_Check(value) || PointerObject_Check(value)) {
/* c_wchar array instance or pointer(c_wchar(...)) */ /* c_wchar array instance or pointer(c_wchar(...)) */
StgDictObject *dt = PyObject_stgdict(value); StgDictObject *dt = PyObject_stgdict(value);
StgDictObject *dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL; StgDictObject *dict;
assert(dt); /* Cannot be NULL for pointer or array objects */
dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL;
if (dict && (dict->setfunc == getentry("u")->setfunc)) { if (dict && (dict->setfunc == getentry("u")->setfunc)) {
Py_INCREF(value); Py_INCREF(value);
return value; return value;
...@@ -1216,7 +1218,9 @@ c_char_p_from_param(PyObject *type, PyObject *value) ...@@ -1216,7 +1218,9 @@ c_char_p_from_param(PyObject *type, PyObject *value)
if (ArrayObject_Check(value) || PointerObject_Check(value)) { if (ArrayObject_Check(value) || PointerObject_Check(value)) {
/* c_char array instance or pointer(c_char(...)) */ /* c_char array instance or pointer(c_char(...)) */
StgDictObject *dt = PyObject_stgdict(value); StgDictObject *dt = PyObject_stgdict(value);
StgDictObject *dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL; StgDictObject *dict;
assert(dt); /* Cannot be NULL for pointer or array objects */
dict = dt && dt->proto ? PyType_stgdict(dt->proto) : NULL;
if (dict && (dict->setfunc == getentry("c")->setfunc)) { if (dict && (dict->setfunc == getentry("c")->setfunc)) {
Py_INCREF(value); Py_INCREF(value);
return value; return value;
...@@ -1468,7 +1472,7 @@ SimpleType_paramfunc(CDataObject *self) ...@@ -1468,7 +1472,7 @@ SimpleType_paramfunc(CDataObject *self)
struct fielddesc *fd; struct fielddesc *fd;
dict = PyObject_stgdict((PyObject *)self); dict = PyObject_stgdict((PyObject *)self);
assert(dict); assert(dict); /* Cannot be NULL for CDataObject instances */
fmt = PyString_AsString(dict->proto); fmt = PyString_AsString(dict->proto);
assert(fmt); assert(fmt);
...@@ -2066,6 +2070,7 @@ static int ...@@ -2066,6 +2070,7 @@ static int
CData_clear(CDataObject *self) CData_clear(CDataObject *self)
{ {
StgDictObject *dict = PyObject_stgdict((PyObject *)self); StgDictObject *dict = PyObject_stgdict((PyObject *)self);
assert(dict); /* Cannot be NULL for CDataObject instances */
Py_CLEAR(self->b_objects); Py_CLEAR(self->b_objects);
if ((self->b_needsfree) if ((self->b_needsfree)
&& ((size_t)dict->size > sizeof(self->b_value))) && ((size_t)dict->size > sizeof(self->b_value)))
...@@ -2363,7 +2368,9 @@ _CData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, ...@@ -2363,7 +2368,9 @@ _CData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
StgDictObject *p1, *p2; StgDictObject *p1, *p2;
PyObject *keep; PyObject *keep;
p1 = PyObject_stgdict(value); p1 = PyObject_stgdict(value);
assert(p1); /* Cannot be NULL for array instances */
p2 = PyType_stgdict(type); p2 = PyType_stgdict(type);
assert(p2); /* Cannot be NULL for pointer types */
if (p1->proto != p2->proto) { if (p1->proto != p2->proto) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
...@@ -2512,7 +2519,7 @@ CFuncPtr_get_restype(CFuncPtrObject *self) ...@@ -2512,7 +2519,7 @@ CFuncPtr_get_restype(CFuncPtrObject *self)
return self->restype; return self->restype;
} }
dict = PyObject_stgdict((PyObject *)self); dict = PyObject_stgdict((PyObject *)self);
assert(dict); assert(dict); /* Cannot be NULL for CFuncPtrObject instances */
if (dict->restype) { if (dict->restype) {
Py_INCREF(dict->restype); Py_INCREF(dict->restype);
return dict->restype; return dict->restype;
...@@ -2554,7 +2561,7 @@ CFuncPtr_get_argtypes(CFuncPtrObject *self) ...@@ -2554,7 +2561,7 @@ CFuncPtr_get_argtypes(CFuncPtrObject *self)
return self->argtypes; return self->argtypes;
} }
dict = PyObject_stgdict((PyObject *)self); dict = PyObject_stgdict((PyObject *)self);
assert(dict); assert(dict); /* Cannot be NULL for CFuncPtrObject instances */
if (dict->argtypes) { if (dict->argtypes) {
Py_INCREF(dict->argtypes); Py_INCREF(dict->argtypes);
return dict->argtypes; return dict->argtypes;
...@@ -2647,8 +2654,12 @@ static int ...@@ -2647,8 +2654,12 @@ static int
_validate_paramflags(PyTypeObject *type, PyObject *paramflags) _validate_paramflags(PyTypeObject *type, PyObject *paramflags)
{ {
int i, len; int i, len;
StgDictObject *dict = PyType_stgdict((PyObject *)type); StgDictObject *dict;
PyObject *argtypes = dict->argtypes; PyObject *argtypes;
dict = PyType_stgdict((PyObject *)type);
assert(dict); /* Cannot be NULL. 'type' is a CFuncPtr type. */
argtypes = dict->argtypes;
if (paramflags == NULL || dict->argtypes == NULL) if (paramflags == NULL || dict->argtypes == NULL)
return 1; return 1;
...@@ -3260,7 +3271,7 @@ CFuncPtr_call(CFuncPtrObject *self, PyObject *inargs, PyObject *kwds) ...@@ -3260,7 +3271,7 @@ CFuncPtr_call(CFuncPtrObject *self, PyObject *inargs, PyObject *kwds)
int outmask; int outmask;
unsigned int numretvals; unsigned int numretvals;
assert(dict); /* if not, it's a bug */ assert(dict); /* Cannot be NULL for CFuncPtrObject instances */
restype = self->restype ? self->restype : dict->restype; restype = self->restype ? self->restype : dict->restype;
converters = self->converters ? self->converters : dict->converters; converters = self->converters ? self->converters : dict->converters;
checker = self->checker ? self->checker : dict->checker; checker = self->checker ? self->checker : dict->checker;
...@@ -3681,7 +3692,7 @@ Array_item(PyObject *_self, Py_ssize_t index) ...@@ -3681,7 +3692,7 @@ Array_item(PyObject *_self, Py_ssize_t index)
} }
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); assert(stgdict); /* Cannot be NULL for array instances */
/* Would it be clearer if we got the item size from /* Would it be clearer if we got the item size from
stgdict->proto's stgdict? stgdict->proto's stgdict?
*/ */
...@@ -3712,6 +3723,7 @@ Array_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) ...@@ -3712,6 +3723,7 @@ Array_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh)
len = ihigh - ilow; len = ihigh - ilow;
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); /* Cannot be NULL for array object instances */
proto = stgdict->proto; proto = stgdict->proto;
itemdict = PyType_stgdict(proto); itemdict = PyType_stgdict(proto);
if (itemdict->getfunc == getentry("c")->getfunc) { if (itemdict->getfunc == getentry("c")->getfunc) {
...@@ -3750,6 +3762,7 @@ Array_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) ...@@ -3750,6 +3762,7 @@ Array_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value)
} }
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); /* Cannot be NULL for array object instances */
if (index < 0 || index >= stgdict->length) { if (index < 0 || index >= stgdict->length) {
PyErr_SetString(PyExc_IndexError, PyErr_SetString(PyExc_IndexError,
"invalid index"); "invalid index");
...@@ -3941,6 +3954,7 @@ Simple_set_value(CDataObject *self, PyObject *value) ...@@ -3941,6 +3954,7 @@ Simple_set_value(CDataObject *self, PyObject *value)
PyObject *result; PyObject *result;
StgDictObject *dict = PyObject_stgdict((PyObject *)self); StgDictObject *dict = PyObject_stgdict((PyObject *)self);
assert(dict); /* Cannot be NULL for CDataObject instances */
assert(dict->setfunc); assert(dict->setfunc);
result = dict->setfunc(self->b_ptr, value, dict->size); result = dict->setfunc(self->b_ptr, value, dict->size);
if (!result) if (!result)
...@@ -3966,8 +3980,8 @@ Simple_get_value(CDataObject *self) ...@@ -3966,8 +3980,8 @@ Simple_get_value(CDataObject *self)
{ {
StgDictObject *dict; StgDictObject *dict;
dict = PyObject_stgdict((PyObject *)self); dict = PyObject_stgdict((PyObject *)self);
assert(dict); /* Cannot be NULL for CDataObject instances */
assert(dict->getfunc); assert(dict->getfunc);
dict = PyObject_stgdict((PyObject *)self);
return dict->getfunc(self->b_ptr, self->b_size); return dict->getfunc(self->b_ptr, self->b_size);
} }
...@@ -4140,11 +4154,10 @@ Pointer_item(PyObject *_self, Py_ssize_t index) ...@@ -4140,11 +4154,10 @@ Pointer_item(PyObject *_self, Py_ssize_t index)
} }
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); assert(stgdict); /* Cannot be NULL for pointer object instances */
assert(stgdict->proto);
proto = stgdict->proto; proto = stgdict->proto;
/* XXXXXX MAKE SURE PROTO IS NOT NULL! */ assert(proto);
itemdict = PyType_stgdict(proto); itemdict = PyType_stgdict(proto);
size = itemdict->size; size = itemdict->size;
offset = index * itemdict->size; offset = index * itemdict->size;
...@@ -4175,11 +4188,11 @@ Pointer_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) ...@@ -4175,11 +4188,11 @@ Pointer_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value)
} }
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); assert(stgdict); /* Cannot be NULL fr pointer instances */
assert(stgdict->proto);
proto = stgdict->proto; proto = stgdict->proto;
/* XXXXXX MAKE SURE PROTO IS NOT NULL! */ assert(proto);
itemdict = PyType_stgdict(proto); itemdict = PyType_stgdict(proto);
size = itemdict->size; size = itemdict->size;
offset = index * itemdict->size; offset = index * itemdict->size;
...@@ -4200,7 +4213,7 @@ Pointer_get_contents(CDataObject *self, void *closure) ...@@ -4200,7 +4213,7 @@ Pointer_get_contents(CDataObject *self, void *closure)
} }
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); assert(stgdict); /* Cannot be NULL fr pointer instances */
return CData_FromBaseObj(stgdict->proto, return CData_FromBaseObj(stgdict->proto,
(PyObject *)self, 0, (PyObject *)self, 0,
*(void **)self->b_ptr); *(void **)self->b_ptr);
...@@ -4219,7 +4232,7 @@ Pointer_set_contents(CDataObject *self, PyObject *value, void *closure) ...@@ -4219,7 +4232,7 @@ Pointer_set_contents(CDataObject *self, PyObject *value, void *closure)
return -1; return -1;
} }
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
/* should have been catched in Pointer_new() */ assert(stgdict); /* Cannot be NULL fr pointer instances */
assert(stgdict->proto); assert(stgdict->proto);
if (!CDataObject_Check(value) if (!CDataObject_Check(value)
|| 0 == PyObject_IsInstance(value, stgdict->proto)) { || 0 == PyObject_IsInstance(value, stgdict->proto)) {
...@@ -4295,8 +4308,11 @@ Pointer_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) ...@@ -4295,8 +4308,11 @@ Pointer_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh)
len = ihigh - ilow; len = ihigh - ilow;
stgdict = PyObject_stgdict((PyObject *)self); stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); /* Cannot be NULL fr pointer instances */
proto = stgdict->proto; proto = stgdict->proto;
assert(proto);
itemdict = PyType_stgdict(proto); itemdict = PyType_stgdict(proto);
assert(itemdict);
if (itemdict->getfunc == getentry("c")->getfunc) { if (itemdict->getfunc == getentry("c")->getfunc) {
char *ptr = *(char **)self->b_ptr; char *ptr = *(char **)self->b_ptr;
return PyString_FromStringAndSize(ptr + ilow, len); return PyString_FromStringAndSize(ptr + ilow, len);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment