PyObject_Generic{Get,Set}Attr:
authorGuido van Rossum <guido@python.org>
Wed, 19 Feb 2003 03:19:29 +0000 (03:19 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Feb 2003 03:19:29 +0000 (03:19 +0000)
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

index 10877b5e2ddb23b80861c08b8996ef6fe001302e..bf8056c655153ef06e7d1b25518f3a56fac29298 100644 (file)
@@ -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);