diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 21c7b8cbb26..b5a10edc12e 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4502,6 +4502,14 @@ order (MRO) for bases """ self.assertEqual(float.real.__qualname__, 'float.real') self.assertEqual(int.__add__.__qualname__, 'int.__add__') + class X: + pass + with self.assertRaises(TypeError): + del X.__qualname__ + + self.assertRaises(TypeError, type.__dict__['__qualname__'].__set__, + str, 'Oink') + def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} tp = type('Foo', (), ns) diff --git a/Misc/NEWS b/Misc/NEWS index 726d1f75ce4..347885fed14 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 3.3.1? Core and Builtins ----------------- +- Fix segfaults on setting __qualname__ on builtin types and attempting to + delete it on any type. + - Issue #16271: Fix strange bugs that resulted from __qualname__ appearing in a class's __dict__ and on type. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 9f0d13e3695..413c7da9df8 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -311,6 +311,8 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context) { PyHeapTypeObject* et; + if (!check_set_special_type_attr(type, value, "__qualname__")) + return -1; if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "can only assign string to %s.__qualname__, not '%s'",