]> granicus.if.org Git - python/commitdiff
Issue13674 Correct crash with strftime %y format under Windows
authorTim Golden <mail@timgolden.me.uk>
Tue, 12 Nov 2013 12:36:54 +0000 (12:36 +0000)
committerTim Golden <mail@timgolden.me.uk>
Tue, 12 Nov 2013 12:36:54 +0000 (12:36 +0000)
Lib/test/test_strftime.py
Modules/timemodule.c

index 14057eb34acbb0ca03189d61e4953cb0e8d3abdb..78c9c5bdb92555518aa9ad48c8ab5f009ca91993 100644 (file)
@@ -176,8 +176,32 @@ class StrftimeTest(unittest.TestCase):
                            (e[0], e[2]))
                     print("  Expected %s, but got %s" % (e[1], result))
 
+
+class Y1900Tests(unittest.TestCase):
+    """A limitation of the MS C runtime library is that it crashes if
+    a date before 1900 is passed with a format string containing "%y"
+    """
+
+    @unittest.skipUnless(sys.platform == "win32", "Only applies to Windows")
+    def test_y_before_1900_win(self):
+        with self.assertRaises(ValueError):
+            time.strftime("%y", (1899, 1, 1, 0, 0, 0, 0, 0, 0))
+
+    @unittest.skipIf(sys.platform == "win32", "Doesn't apply on Windows")
+    def test_y_before_1900_nonwin(self):
+        self.assertEquals(
+            time.strftime("%y", (1899, 1, 1, 0, 0, 0, 0, 0, 0)), "99")
+
+    def test_y_1900(self):
+        self.assertEquals(
+            time.strftime("%y", (1900, 1, 1, 0, 0, 0, 0, 0, 0)), "00")
+
+    def test_y_after_1900(self):
+        self.assertEquals(
+            time.strftime("%y", (2013, 1, 1, 0, 0, 0, 0, 0, 0)), "13")
+
 def test_main():
-    support.run_unittest(StrftimeTest)
+    support.run_unittest(StrftimeTest, Y1900Tests)
 
 if __name__ == '__main__':
     test_main()
index 03476d97dcead1439fbb956a3a518bf0437b5b4d..42ec3662e88292638a31f4907531bb6206d71caa 100644 (file)
@@ -632,6 +632,13 @@ time_strftime(PyObject *self, PyObject *args)
             Py_DECREF(format);
             return NULL;
         }
+        if ((outbuf[1] == 'y') && buf.tm_year < 0)
+        {
+            PyErr_SetString(PyExc_ValueError,
+                        "format %y requires year >= 1900 on Windows");
+            Py_DECREF(format);
+            return NULL;
+        }
     }
 #endif