From 90195e2616288d6dfdb9a081edaab684fd59ef7e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 19 Feb 2003 03:19:29 +0000 Subject: 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. --- Objects/object.c | 6 ++++-- 1 file 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); -- cgit v0.12