summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2004-03-02 04:38:10 (GMT)
committerBrett Cannon <bcannon@gmail.com>2004-03-02 04:38:10 (GMT)
commitd1080a3418b2a162b44d0d5738a6da2276133eb7 (patch)
tree73902ccab6d9c184e726722e1e999fc460b5a90b /Lib
parent0a4977c2f3b8b3cd80f326f44e87076b2578b1b6 (diff)
downloadcpython-d1080a3418b2a162b44d0d5738a6da2276133eb7.zip
cpython-d1080a3418b2a162b44d0d5738a6da2276133eb7.tar.gz
cpython-d1080a3418b2a162b44d0d5738a6da2276133eb7.tar.bz2
Have strftime() check its time tuple argument to make sure the tuple's values
are within proper boundaries as specified in the docs. This can break possible code (datetime module needed changing, for instance) that uses 0 for values that need to be greater 1 or greater (month, day, and day of year). Fixes bug #897625.
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/test/test_strftime.py2
-rw-r--r--Lib/test/test_time.py56
2 files changed, 57 insertions, 1 deletions
diff --git a/Lib/test/test_strftime.py b/Lib/test/test_strftime.py
index 9bd045d..44e2ae2 100755
--- a/Lib/test/test_strftime.py
+++ b/Lib/test/test_strftime.py
@@ -38,7 +38,7 @@ def strftest(now):
if now[3] < 12: ampm='(AM|am)'
else: ampm='(PM|pm)'
- jan1 = time.localtime(time.mktime((now[0], 1, 1) + (0,)*6))
+ jan1 = time.localtime(time.mktime((now[0], 1, 1, 0, 0, 0, 0, 1, 0)))
try:
if now[8]: tz = time.tzname[1]
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
index 4b9ed99..9e16d0b 100644
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -37,6 +37,62 @@ class TimeTestCase(unittest.TestCase):
except ValueError:
self.fail('conversion specifier: %r failed.' % format)
+ def test_strftime_bounds_checking(self):
+ # Make sure that strftime() checks the bounds of the various parts
+ #of the time tuple.
+
+ # Check year
+ self.assertRaises(ValueError, time.strftime, '',
+ (1899, 1, 1, 0, 0, 0, 0, 1, -1))
+ if time.accept2dyear:
+ self.assertRaises(ValueError, time.strftime, '',
+ (-1, 1, 1, 0, 0, 0, 0, 1, -1))
+ self.assertRaises(ValueError, time.strftime, '',
+ (100, 1, 1, 0, 0, 0, 0, 1, -1))
+ # Check month
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 0, 1, 0, 0, 0, 0, 1, -1))
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 13, 1, 0, 0, 0, 0, 1, -1))
+ # Check day of month
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 0, 0, 0, 0, 0, 1, -1))
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 32, 0, 0, 0, 0, 1, -1))
+ # Check hour
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, -1, 0, 0, 0, 1, -1))
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 24, 0, 0, 0, 1, -1))
+ # Check minute
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, -1, 0, 0, 1, -1))
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 60, 0, 0, 1, -1))
+ # Check second
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, -1, 0, 1, -1))
+ # C99 only requires allowing for one leap second, but Python's docs say
+ # allow two leap seconds (0..61)
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, 62, 0, 1, -1))
+ # No check for upper-bound day of week;
+ # value forced into range by a ``% 7`` calculation.
+ # Start check at -2 since gettmarg() increments value before taking
+ # modulo.
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, 0, -2, 1, -1))
+ # Check day of the year
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, 0, 0, 0, -1))
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, 0, 0, 367, -1))
+ # Check daylight savings flag
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, 0, 0, 1, -2))
+ self.assertRaises(ValueError, time.strftime, '',
+ (1900, 1, 1, 0, 0, 0, 0, 1, 2))
+
def test_strptime(self):
tt = time.gmtime(self.t)
for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',