diff options
author | Benjamin Peterson <benjamin@python.org> | 2014-04-02 16:15:06 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2014-04-02 16:15:06 (GMT) |
commit | 9b09ba1234f8ba7a01eaf8986147ae0758712089 (patch) | |
tree | 04928077ec795bc7fd41d0e5ab77532bb2092b08 | |
parent | 24dfb05d4f7de2d28db2c69560d3afa8f612242c (diff) | |
download | cpython-9b09ba1234f8ba7a01eaf8986147ae0758712089.zip cpython-9b09ba1234f8ba7a01eaf8986147ae0758712089.tar.gz cpython-9b09ba1234f8ba7a01eaf8986147ae0758712089.tar.bz2 |
bail in unicode error's __str__ methods if the objects are not properly initialized (closes #21134)
-rw-r--r-- | Lib/test/test_exceptions.py | 6 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/exceptions.c | 12 |
3 files changed, 21 insertions, 0 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 80e921a..61347de 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -800,6 +800,12 @@ class ExceptionTests(unittest.TestCase): u.start = 1000 self.assertEqual(str(u), "can't translate characters in position 1000-4: 965230951443685724997") + def test_unicode_errors_no_object(self): + # See issue #21134. + klasses = UnicodeDecodeError, UnicodeDecodeError, UnicodeTranslateError + for klass in klasses: + self.assertEqual(str(klass.__new__(klass)), "") + @no_tracing def test_badisinstance(self): # Bug #2542: if issubclass(e, MyException) raises an exception, @@ -10,6 +10,9 @@ Release date: TBA Core and Builtins ----------------- +- Issue #21134: Fix segfault when str is called on an uninitialized + UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object. + - Issue #19537: Fix PyUnicode_DATA() alignment under m68k. Patch by Andreas Schwab. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 44e60dd..861dbc7 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -1837,6 +1837,10 @@ UnicodeEncodeError_str(PyObject *self) PyObject *reason_str = NULL; PyObject *encoding_str = NULL; + if (!uself->object) + /* Not properly initialized. */ + return PyUnicode_FromString(""); + /* Get reason and encoding as strings, which they might not be if they've been modified after we were contructed. */ reason_str = PyObject_Str(uself->reason); @@ -1955,6 +1959,10 @@ UnicodeDecodeError_str(PyObject *self) PyObject *reason_str = NULL; PyObject *encoding_str = NULL; + if (!uself->object) + /* Not properly initialized. */ + return PyUnicode_FromString(""); + /* Get reason and encoding as strings, which they might not be if they've been modified after we were contructed. */ reason_str = PyObject_Str(uself->reason); @@ -2049,6 +2057,10 @@ UnicodeTranslateError_str(PyObject *self) PyObject *result = NULL; PyObject *reason_str = NULL; + if (!uself->object) + /* Not properly initialized. */ + return PyUnicode_FromString(""); + /* Get reason as a string, which it might not be if it's been modified after we were contructed. */ reason_str = PyObject_Str(uself->reason); |