Merged revisions 74040,74042 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r74040 | hirokazu.yamamoto | 2009-07-17 15:20:46 +0900 | 1 line
Issue #6415: Fixed warnings.warn sagfault on bad formatted string.
........
r74042 | hirokazu.yamamoto | 2009-07-17 15:26:54 +0900 | 1 line
NEWS about r74040.
........
diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
index b37cdf7..1f5d05f 100644
--- a/Lib/test/test_warnings.py
+++ b/Lib/test/test_warnings.py
@@ -337,6 +337,19 @@
self.module.warn_explicit,
None, Warning, None, 1, registry=42)
+ def test_bad_str(self):
+ # issue 6415
+ # Warnings instance with a bad format string for __str__ should not
+ # trigger a bus error.
+ class BadStrWarning(Warning):
+ """Warning with a bad format string for __str__."""
+ def __str__(self):
+ return ("A bad formatted string %(err)" %
+ {"err" : "there is no %(err)s"})
+
+ with self.assertRaises(ValueError):
+ self.module.warn(BadStrWarning())
+
class CWarnTests(BaseTest, WarnTests):
module = c_warnings
diff --git a/Misc/NEWS b/Misc/NEWS
index fee9d61..8e6cbb8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -62,6 +62,8 @@
Library
-------
+- Issue #6415: Fixed warnings.warn sagfault on bad formatted string.
+
- Issue #6344: Fixed a crash of mmap.read() when passed a negative argument.
- Issue #5230: pydoc would report no documentation found if a module generated
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 6a970bb..1f0f58e 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -304,6 +304,8 @@
}
if (rc == 1) {
text = PyObject_Str(message);
+ if (text == NULL)
+ goto cleanup;
category = (PyObject*)message->ob_type;
}
else {