]> granicus.if.org Git - python/commitdiff
Issue #16445: Fix potential segmentation fault when deleting an exception message.
authorMark Dickinson <dickinsm@gmail.com>
Sun, 3 Mar 2013 11:13:34 +0000 (11:13 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 3 Mar 2013 11:13:34 +0000 (11:13 +0000)
Lib/test/test_exceptions.py
Misc/NEWS
Objects/exceptions.c

index 216064161cb3a9bbd869867c65daa2bed2562f58..a485cba893c0e234fb5d9aa61f6bd1b47ccc7637 100644 (file)
@@ -479,6 +479,18 @@ class ExceptionTests(unittest.TestCase):
         except AssertionError as e:
             self.assertEqual(str(e), "(3,)")
 
+    def test_bad_exception_clearing(self):
+        # See issue 16445: use of Py_XDECREF instead of Py_CLEAR in
+        # BaseException_set_message gave a possible way to segfault the
+        # interpreter.
+        class Nasty(str):
+            def __del__(message):
+                del e.message
+
+        e = ValueError(Nasty("msg"))
+        e.args = ()
+        del e.message
+
 
 # Helper class used by TestSameStrAndUnicodeMsg
 class ExcWithOverriddenStr(Exception):
index 78d52f0db7d4ba84796ea406f8ee35a17d7321cb..4f6fdca3aa8a9b788e3558587c55ef16fbd860ed 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -9,6 +9,9 @@ What's New in Python 2.7.4
 Core and Builtins
 -----------------
 
+- Issue #16445: Fixed potential segmentation fault when deleting an exception
+  message.
+
 - Issue #17275: Corrected class name in init error messages of the C version of
   BufferedWriter and BufferedRandom.
 
index 49f6d30cd3c924c090d5d6809001144cc5102397..0f86cfb194237f39f6974dbf65de380f4e6070df 100644 (file)
@@ -349,8 +349,7 @@ BaseException_set_message(PyBaseExceptionObject *self, PyObject *val)
             if (PyDict_DelItemString(self->dict, "message") < 0)
                 return -1;
         }
-        Py_XDECREF(self->message);
-        self->message = NULL;
+        Py_CLEAR(self->message);
         return 0;
     }