]> granicus.if.org Git - python/commitdiff
do safety checks on __qualname__ assignment
authorBenjamin Peterson <benjamin@python.org>
Wed, 31 Oct 2012 04:01:15 +0000 (00:01 -0400)
committerBenjamin Peterson <benjamin@python.org>
Wed, 31 Oct 2012 04:01:15 +0000 (00:01 -0400)
Lib/test/test_descr.py
Misc/NEWS
Objects/typeobject.c

index 21c7b8cbb26ecfcf0affe4269a3fb563848b58c0..b5a10edc12e183ac994b939f2310f9f7ce7a1900 100644 (file)
@@ -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)
index 726d1f75ce4c84e6fe4996130d889b9b77918470..347885fed141cedd07dca4dfffbee813e80e9c69 100644 (file)
--- 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.
 
index 9f0d13e3695defd521ce08ee3913d229b27193c1..413c7da9df8609050805af1ea651453a47f07b7e 100644 (file)
@@ -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'",