summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2014-04-02 16:15:06 (GMT)
committerBenjamin Peterson <benjamin@python.org>2014-04-02 16:15:06 (GMT)
commit9b09ba1234f8ba7a01eaf8986147ae0758712089 (patch)
tree04928077ec795bc7fd41d0e5ab77532bb2092b08
parent24dfb05d4f7de2d28db2c69560d3afa8f612242c (diff)
downloadcpython-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.py6
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/exceptions.c12
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,
diff --git a/Misc/NEWS b/Misc/NEWS
index 0458c4e..9e59154 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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);