From 9fc8a29663268a3ed5b8db15c4b7b7786f80e13e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 24 May 2002 21:40:08 +0000 Subject: [PATCH] Fix for SF bug 551412. When _PyType_Lookup() is called on a type whose tp_mro hasn't been initialized, it would dump core. Fix this by checking for NULL and calling PyType_Ready(). Will fix this in 2.2.1 too. --- Lib/test/test_descr.py | 16 ++++++++++++++++ Objects/typeobject.c | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index e7e4a8f2bb8..faa9d89bdc8 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -3019,7 +3019,23 @@ class MyStr(str): except: raise TestFailed, "string subclass allowed as exception" +def do_this_first(): + if verbose: + print "Testing SF bug 551412 ..." + # This dumps core when SF bug 551412 isn't fixed -- + # but only when test_descr.py is run separately. + # (That can't be helped -- as soon as PyType_Ready() + # is called for PyLong_Type, the bug is gone.) + class UserLong(object): + def __pow__(self, *args): + pass + try: + pow(0L, UserLong(), 0L) + except: + pass + def test_main(): + do_this_first() class_docstrings() lists() dicts() diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 61cbeae3777..af133eadc2f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1221,6 +1221,12 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) /* Look in tp_dict of types in MRO */ mro = type->tp_mro; + if (mro == NULL) { + if (PyType_Ready(type) < 0) + return NULL; + mro = type->tp_mro; + assert(mro != NULL); + } assert(PyTuple_Check(mro)); n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) {