diff options
author | Guido van Rossum <guido@python.org> | 2003-02-19 03:19:29 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2003-02-19 03:19:29 (GMT) |
commit | 90195e2616288d6dfdb9a081edaab684fd59ef7e (patch) | |
tree | 14d9ea31446583d2e3cd2bf6e92d1208301adb45 /Objects | |
parent | 3b5de4db92db06dbd9a32826fdbdb751f3e5054f (diff) | |
download | cpython-90195e2616288d6dfdb9a081edaab684fd59ef7e.zip cpython-90195e2616288d6dfdb9a081edaab684fd59ef7e.tar.gz cpython-90195e2616288d6dfdb9a081edaab684fd59ef7e.tar.bz2 |
PyObject_Generic{Get,Set}Attr:
Don't access tp_descr_{get,set} of a descriptor without checking the
flag bits of the descriptor's type. While we know that the main type
(the type of the object whose attribute is being accessed) has all the
right flag bits (or else PyObject_Generic{Get,Set}Attr wouldn't be
called), we don't know that for its class attributes!
Will backport to 2.2.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/object.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/Objects/object.c b/Objects/object.c index 10877b5..bf8056c 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1362,7 +1362,8 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) } f = NULL; - if (descr != NULL) { + if (descr != NULL && + PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { f = descr->ob_type->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { res = f(descr, obj, (PyObject *)obj->ob_type); @@ -1454,7 +1455,8 @@ PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value) descr = _PyType_Lookup(tp, name); f = NULL; - if (descr != NULL) { + if (descr != NULL && + PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { f = descr->ob_type->tp_descr_set; if (f != NULL && PyDescr_IsData(descr)) { res = f(descr, obj, value); |