From 915f0eb212f62f10611180ed2d7874dae5bc66e3 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 17 Oct 2001 20:26:38 +0000 Subject: [PATCH] Protect references to tp_descr_get and tp_dict with the appropriate test: PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS). --- Objects/classobject.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Objects/classobject.c b/Objects/classobject.c index cef1894737e..57de8e9e211 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -4,6 +4,9 @@ #include "Python.h" #include "structmember.h" +#define TP_DESCR_GET(t) \ + (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL) + /* Forward */ static PyObject *class_lookup(PyClassObject *, PyObject *, @@ -232,7 +235,7 @@ class_getattr(register PyClassObject *op, PyObject *name) PyString_AS_STRING(op->cl_name), sname); return NULL; } - f = v->ob_type->tp_descr_get; + f = TP_DESCR_GET(v->ob_type); if (f == NULL) Py_INCREF(v); else @@ -693,7 +696,7 @@ instance_getattr2(register PyInstanceObject *inst, PyObject *name) v = class_lookup(inst->in_class, name, &class); if (v != NULL) { Py_INCREF(v); - f = v->ob_type->tp_descr_get; + f = TP_DESCR_GET(v->ob_type); if (f != NULL) { PyObject *w = f(v, (PyObject *)inst, (PyObject *)(inst->in_class)); @@ -2054,18 +2057,20 @@ instancemethod_getattro(PyObject *obj, PyObject *name) { PyMethodObject *im = (PyMethodObject *)obj; PyTypeObject *tp = obj->ob_type; - PyObject *descr, *res; - descrgetfunc f; + PyObject *descr = NULL, *res; + descrgetfunc f = NULL; - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) - return NULL; + if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) { + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) + return NULL; + } + descr = _PyType_Lookup(tp, name); } - descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) { - f = descr->ob_type->tp_descr_get; + f = TP_DESCR_GET(descr->ob_type); if (f != NULL && PyDescr_IsData(descr)) return f(descr, obj, (PyObject *)obj->ob_type); }