[Python-checkins] cpython: Issue #15229: An OSError subclass whose __init__ doesn't call back

antoine.pitrou python-checkins at python.org
Sat Jun 30 23:38:49 CEST 2012


http://hg.python.org/cpython/rev/1cbab581bf1e
changeset:   77894:1cbab581bf1e
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sat Jun 30 23:37:47 2012 +0200
summary:
  Issue #15229: An OSError subclass whose __init__ doesn't call back
OSError.__init__ could produce incomplete instances, leading to crashes
when calling str() on them.

files:
  Lib/test/test_pep3151.py |  10 ++++++++++
  Misc/NEWS                |   3 +++
  Objects/exceptions.c     |   6 ++++++
  3 files changed, 19 insertions(+), 0 deletions(-)


diff --git a/Lib/test/test_pep3151.py b/Lib/test/test_pep3151.py
--- a/Lib/test/test_pep3151.py
+++ b/Lib/test/test_pep3151.py
@@ -29,6 +29,10 @@
 class SubOSErrorCombinedNewFirst(SubOSErrorWithNew, SubOSErrorWithInit):
     pass
 
+class SubOSErrorWithStandaloneInit(OSError):
+    def __init__(self):
+        pass
+
 
 class HierarchyTest(unittest.TestCase):
 
@@ -193,6 +197,12 @@
         self.assertEqual(e.baz, "baz")
         self.assertEqual(e.args, ("some message",))
 
+    def test_init_standalone(self):
+        # __init__ doesn't propagate to OSError.__init__ (see issue #15229)
+        e = SubOSErrorWithStandaloneInit()
+        self.assertEqual(e.args, ())
+        self.assertEqual(str(e), '')
+
 
 def test_main():
     support.run_unittest(__name__)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #15229: An OSError subclass whose __init__ doesn't call back
+  OSError.__init__ could produce incomplete instances, leading to crashes
+  when calling str() on them.
 
 Library
 -------
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -834,6 +834,7 @@
 #endif
 
     /* Steals the reference to args */
+    Py_CLEAR(self->args);
     self->args = args;
     args = NULL;
 
@@ -916,6 +917,11 @@
             ))
             goto error;
     }
+    else {
+        self->args = PyTuple_New(0);
+        if (self->args == NULL)
+            goto error;
+    }
 
     return (PyObject *) self;
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list