always check return value of PyObject_IsInstance for error

This commit is contained in:
Benjamin Peterson 2011-03-26 18:04:09 -05:00
parent f21ad92351
commit de39047cc6
1 changed files with 41 additions and 19 deletions

View File

@ -620,7 +620,10 @@ static PyObject *
CDataType_from_param(PyObject *type, PyObject *value)
{
PyObject *as_parameter;
if (1 == PyObject_IsInstance(value, type)) {
int res = PyObject_IsInstance(value, type);
if (res == -1)
return NULL;
if (res) {
Py_INCREF(value);
return value;
}
@ -633,10 +636,14 @@ CDataType_from_param(PyObject *type, PyObject *value)
/* If we got a PyCArgObject, we must check if the object packed in it
is an instance of the type's dict->proto */
if(dict && ob
&& PyObject_IsInstance(ob, dict->proto)) {
Py_INCREF(value);
return value;
if(dict && ob) {
res = PyObject_IsInstance(ob, dict->proto);
if (res == -1)
return NULL;
if (res) {
Py_INCREF(value);
return value;
}
}
ob_name = (ob) ? Py_TYPE(ob)->tp_name : "???";
PyErr_Format(PyExc_TypeError,
@ -989,8 +996,7 @@ PyCPointerType_from_param(PyObject *type, PyObject *value)
Py_INCREF(value); /* _byref steals a refcount */
return _byref(value);
case -1:
PyErr_Clear();
break;
return NULL;
default:
break;
}
@ -1516,7 +1522,10 @@ c_wchar_p_from_param(PyObject *type, PyObject *value)
}
return (PyObject *)parg;
}
if (PyObject_IsInstance(value, type)) {
res = PyObject_IsInstance(value, type);
if (res == -1)
return NULL;
if (res) {
Py_INCREF(value);
return value;
}
@ -1580,7 +1589,10 @@ c_char_p_from_param(PyObject *type, PyObject *value)
}
return (PyObject *)parg;
}
if (PyObject_IsInstance(value, type)) {
res = PyObject_IsInstance(value, type);
if (res == -1)
return NULL;
if (res) {
Py_INCREF(value);
return value;
}
@ -1684,7 +1696,10 @@ c_void_p_from_param(PyObject *type, PyObject *value)
return (PyObject *)parg;
}
/* c_void_p instance (or subclass) */
if (PyObject_IsInstance(value, type)) {
res = PyObject_IsInstance(value, type);
if (res == -1)
return NULL;
if (res) {
/* c_void_p instances */
Py_INCREF(value);
return value;
@ -2836,6 +2851,7 @@ _PyCData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
Py_ssize_t size, char *ptr)
{
CDataObject *src;
int err;
if (setfunc)
return setfunc(ptr, value, size);
@ -2876,7 +2892,10 @@ _PyCData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
}
src = (CDataObject *)value;
if (PyObject_IsInstance(value, type)) {
err = PyObject_IsInstance(value, type);
if (err == -1)
return NULL;
if (err) {
memcpy(ptr,
src->b_ptr,
size);
@ -4966,14 +4985,17 @@ Pointer_set_contents(CDataObject *self, PyObject *value, void *closure)
stgdict = PyObject_stgdict((PyObject *)self);
assert(stgdict); /* Cannot be NULL fr pointer instances */
assert(stgdict->proto);
if (!CDataObject_Check(value)
|| 0 == PyObject_IsInstance(value, stgdict->proto)) {
/* XXX PyObject_IsInstance could return -1! */
PyErr_Format(PyExc_TypeError,
"expected %s instead of %s",
((PyTypeObject *)(stgdict->proto))->tp_name,
Py_TYPE(value)->tp_name);
return -1;
if (!CDataObject_Check(value)) {
int res = PyObject_IsInstance(value, stgdict->proto);
if (res == -1)
return -1;
if (!res) {
PyErr_Format(PyExc_TypeError,
"expected %s instead of %s",
((PyTypeObject *)(stgdict->proto))->tp_name,
Py_TYPE(value)->tp_name);
return -1;
}
}
dst = (CDataObject *)value;