diff options
-rw-r--r-- | Lib/test/test_time.py | 13 | ||||
-rw-r--r-- | Modules/timemodule.c | 33 |
2 files changed, 31 insertions, 15 deletions
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index e4b6a0fb46..d3de933cc8 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -308,13 +308,24 @@ class TestDontAccept2Year(TestAccept2Year): def test_invalid(self): pass +class TestAccept2YearBad(TestAccept2Year): + class X: + def __bool__(self): + raise RuntimeError('boo') + accept2dyear = X() + def test_2dyear(self): + pass + def test_invalid(self): + self.assertRaises(RuntimeError, self.yearstr, 200) + + class TestDontAccept2YearBool(TestDontAccept2Year): accept2dyear = False def test_main(): support.run_unittest(TimeTestCase, TestLocale, - TestAccept2Year, TestAccept2YearBool, + TestAccept2Year, TestAccept2YearBool, TestAccept2YearBad, TestDontAccept2Year, TestDontAccept2YearBool) if __name__ == "__main__": diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 5732f15265..46c90ecdc9 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -332,23 +332,27 @@ gettmarg(PyObject *args, struct tm *p) if (y < 1000) { PyObject *accept = PyDict_GetItemString(moddict, "accept2dyear"); - int acceptval = accept != NULL && PyObject_IsTrue(accept); - if (acceptval == -1) - return 0; - if (acceptval) { - if (0 <= y && y < 69) - y += 2000; - else if (69 <= y && y < 100) - y += 1900; - else { - PyErr_SetString(PyExc_ValueError, - "year out of range"); + if (accept != NULL) { + int acceptval = PyObject_IsTrue(accept); + if (acceptval == -1) return 0; + if (acceptval) { + if (0 <= y && y < 69) + y += 2000; + else if (69 <= y && y < 100) + y += 1900; + else { + PyErr_SetString(PyExc_ValueError, + "year out of range"); + return 0; + } + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Century info guessed for a 2-digit year.", 1) != 0) + return 0; } - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Century info guessed for a 2-digit year.", 1) != 0) - return 0; } + else + return 0; } p->tm_year = y - 1900; p->tm_mon--; @@ -477,6 +481,7 @@ time_strftime(PyObject *self, PyObject *args) PyErr_Format(PyExc_ValueError, "year=%d is before 1900; " "the strftime() method requires year >= 1900", buf.tm_year + 1900); + return NULL; } /* Normalize tm_isdst just in case someone foolishly implements %Z |