From 4fb96f41f4525c25dcba386db96e5298e563cf65 Mon Sep 17 00:00:00 2001 From: Alexander Belopolsky Date: Tue, 15 Feb 2011 15:40:59 +0000 Subject: Merged revisions 87919 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r87919 | alexander.belopolsky | 2011-01-10 20:21:25 -0500 (Mon, 10 Jan 2011) | 4 lines Issue #1726687: time.mktime() will now correctly compute value one second before epoch. Original patch by Peter Wang, reported by Martin Blais. ........ --- Lib/test/test_time.py | 9 +++++++++ Modules/timemodule.c | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 8c1d8f8..d4f7d80 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -233,6 +233,15 @@ class TimeTestCase(unittest.TestCase): t1 = time.mktime(lt1) self.assertTrue(0 <= (t1-t0) < 0.2) + 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) + class TestLocale(unittest.TestCase): def setUp(self): self.oldloc = locale.setlocale(locale.LC_ALL) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 29b4eea..8c40d21 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -703,8 +703,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; -- cgit v0.12