summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-09-07 18:52:13 (GMT)
committerGuido van Rossum <guido@python.org>2001-09-07 18:52:13 (GMT)
commit9478d07ee71161a8098da53b4b902899f36bf6ba (patch)
tree230b5be7376c5e85afaeab4350acc5d29b9d8a93 /Objects
parent317e9f5ef11a5fef1c9d6cd1abf0f4ef32431cbc (diff)
downloadcpython-9478d07ee71161a8098da53b4b902899f36bf6ba.zip
cpython-9478d07ee71161a8098da53b4b902899f36bf6ba.tar.gz
cpython-9478d07ee71161a8098da53b4b902899f36bf6ba.tar.bz2
PyType_IsSubtype(): test tp_flags for HAVE_CLASS bit before accessing
a->tp_mro. If a doesn't have class, it's considered a subclass only of itself or of 'object'. This one fix is enough to prevent the ExtensionClass test suite from dumping core, but that doesn't say much (it's a rather small test suite). Also note that for ExtensionClass-defined types, a different subclass test may be needed. But I haven't checked whether PyType_IsSubtype() is actually used in situations where this matters -- probably it doesn't, since we also don't check for classic classes.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 35dc76f..f15b096 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -273,6 +273,9 @@ PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
{
PyObject *mro;
+ if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
+ return b == a || b == &PyBaseObject_Type;
+
mro = a->tp_mro;
if (mro != NULL) {
/* Deal with multiple inheritance without recursion