mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
Issue #9756: When calling a method descriptor or a slot wrapper descriptor, the
check of the object type doesn't read the __class__ attribute anymore. Fix a crash if a class override its __class__ attribute (e.g. a proxy of the str type).
This commit is contained in:
parent
9c4f09d0f4
commit
3249dec024
3 changed files with 27 additions and 3 deletions
|
|
@ -226,7 +226,8 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds)
|
|||
return NULL;
|
||||
}
|
||||
self = PyTuple_GET_ITEM(args, 0);
|
||||
if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) {
|
||||
if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self),
|
||||
(PyObject *)(descr->d_type))) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"descriptor '%V' "
|
||||
"requires a '%.100s' object "
|
||||
|
|
@ -284,7 +285,8 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds)
|
|||
return NULL;
|
||||
}
|
||||
self = PyTuple_GET_ITEM(args, 0);
|
||||
if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) {
|
||||
if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self),
|
||||
(PyObject *)(descr->d_type))) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"descriptor '%V' "
|
||||
"requires a '%.100s' object "
|
||||
|
|
@ -1065,7 +1067,8 @@ PyWrapper_New(PyObject *d, PyObject *self)
|
|||
|
||||
assert(PyObject_TypeCheck(d, &PyWrapperDescr_Type));
|
||||
descr = (PyWrapperDescrObject *)d;
|
||||
assert(PyObject_IsInstance(self, (PyObject *)(descr->d_type)));
|
||||
assert(_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self),
|
||||
(PyObject *)(descr->d_type)));
|
||||
|
||||
wp = PyObject_GC_New(wrapperobject, &wrappertype);
|
||||
if (wp != NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue