Issue #1726687: time.mktime() will now correctly compute value one
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Tue, 11 Jan 2011 01:21:25 +0000 (01:21 +0000)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Tue, 11 Jan 2011 01:21:25 +0000 (01:21 +0000)
second before epoch.  Original patch by Peter Wang, reported by Martin
Blais.

Lib/test/test_time.py
Modules/timemodule.c

index baabfbbb0aae2275262419930982f3aa4b44d070..d64923201071ed0b6a394d069fe7c94e87387ef1 100644 (file)
@@ -339,6 +339,19 @@ class _Test4dYear(_BaseYearTest):
         self.assertEqual(self.yearstr(-1234), '-1234')
         self.assertEqual(self.yearstr(-123456), '-123456')
 
+
+    def test_mktime(self):
+        # Issue #1726687
+        for t in (-2, -1, 0, 1):
+            try:
+                tt = time.localtime(t)
+            except (OverflowError, ValueError):
+                pass
+            self.assertEqual(time.mktime(tt), t)
+        # Hopefully year = -1 is enough to make OS mktime fail
+        self.assertRaises(OverflowError, time.mktime,
+                          (-1, 1, 1, 0, 0, 0, -1, -1, -1))
+
 class TestAsctimeAccept2dYear(_TestAsctimeYear, _Test2dYear):
     pass
 
index 2286006113d3eaaeb68e8f19beecd2215f34105e..3a12522050f2b39870381ff653fbc68f802ccac8 100644 (file)
@@ -694,8 +694,11 @@ time_mktime(PyObject *self, PyObject *tup)
     time_t tt;
     if (!gettmarg(tup, &buf))
         return NULL;
+    buf.tm_wday = -1;  /* sentinel; original value ignored */
     tt = mktime(&buf);
-    if (tt == (time_t)(-1)) {
+    /* Return value of -1 does not necessarily mean an error, but tm_wday
+     * cannot remain set to -1 if mktime succedded. */
+    if (tt == (time_t)(-1) && buf.tm_wday == -1) {
         PyErr_SetString(PyExc_OverflowError,
                         "mktime argument out of range");
         return NULL;