From 0f38908684505905fd0890f4effbe6f683b39954 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Thu, 4 Apr 2013 02:09:20 +0300 Subject: [PATCH] #17572: Avoid chained exceptions while passing bad directives to time.strptime(). Initial patch by Claudiu Popa. --- Lib/_strptime.py | 2 +- Lib/test/test_strptime.py | 6 ++++++ Lib/test/test_time.py | 6 ++++++ Misc/NEWS | 3 +++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Lib/_strptime.py b/Lib/_strptime.py index b0cd3d619e1..b089b08541a 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -326,7 +326,7 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): bad_directive = "%" del err raise ValueError("'%s' is a bad directive in format '%s'" % - (bad_directive, format)) + (bad_directive, format)) from None # IndexError only occurs when the format string is "%" except IndexError: raise ValueError("stray %% in format '%s'" % format) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 90aac5b3f67..68e6a676363 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -218,6 +218,12 @@ class StrptimeTests(unittest.TestCase): else: self.fail("'%s' did not raise ValueError" % bad_format) + def test_strptime_exception_context(self): + # check that this doesn't chain exceptions needlessly (see #17572) + with self.assertRaises(ValueError) as e: + _strptime._strptime_time('', '%D') + self.assertIs(e.exception.__suppress_context__, True) + def test_unconverteddata(self): # Check ValueError is raised when there is unconverted data self.assertRaises(ValueError, _strptime._strptime_time, "10 12", "%m") diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index da0f555d916..0e4d70284bf 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -193,6 +193,12 @@ class TimeTestCase(unittest.TestCase): self.assertRaises(TypeError, time.strptime, b'2009', "%Y") self.assertRaises(TypeError, time.strptime, '2009', b'%Y') + def test_strptime_exception_context(self): + # check that this doesn't chain exceptions needlessly (see #17572) + with self.assertRaises(ValueError) as e: + time.strptime('', '%D') + self.assertIs(e.exception.__suppress_context__, True) + def test_asctime(self): time.asctime(time.gmtime(self.t)) diff --git a/Misc/NEWS b/Misc/NEWS index 03f9e2f8f7e..4405779a758 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,6 +21,9 @@ Core and Builtins Library ------- +- Issue #17572: Avoid chained exceptions while passing bad directives to + time.strptime(). Initial patch by Claudiu Popa. + - Issue #14254: IDLE now handles readline correctly across shell restarts. - Issue #17614: IDLE no longer raises exception when quickly closing a file.