From 122376df550b71dd3bec0513c7483cc1714212fa Mon Sep 17 00:00:00 2001 From: Justin Blanchard Date: Thu, 29 Aug 2019 03:36:15 -0400 Subject: [PATCH] bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24. (GH-14307) --- Lib/test/datetimetester.py | 27 ++++++++++++------- Misc/ACKS | 1 + .../2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst | 2 ++ Modules/_datetimemodule.c | 2 +- 4 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 58004870a0..b440e5ab5f 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3324,16 +3324,25 @@ class TestTime(HarmlessMixedComparison, unittest.TestCase): def test_compat_unpickle(self): tests = [ - b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.", - b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.', - b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.', + (b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.", + (20, 59, 16, 64**2)), + (b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.', + (20, 59, 16, 64**2)), + (b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.', + (20, 59, 16, 64**2)), + (b"cdatetime\ntime\n(S'\\x14;\\x19\\x00\\x10\\x00'\ntR.", + (20, 59, 25, 64**2)), + (b'cdatetime\ntime\n(U\x06\x14;\x19\x00\x10\x00tR.', + (20, 59, 25, 64**2)), + (b'\x80\x02cdatetime\ntime\nU\x06\x14;\x19\x00\x10\x00\x85R.', + (20, 59, 25, 64**2)), ] - args = 20, 59, 16, 64**2 - expected = self.theclass(*args) - for data in tests: - for loads in pickle_loads: - derived = loads(data, encoding='latin1') - self.assertEqual(derived, expected) + for i, (data, args) in enumerate(tests): + with self.subTest(i=i): + expected = self.theclass(*args) + for loads in pickle_loads: + derived = loads(data, encoding='latin1') + self.assertEqual(derived, expected) def test_bool(self): # time is always True. diff --git a/Misc/ACKS b/Misc/ACKS index d5064f644e..e9ae0ed56b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -162,6 +162,7 @@ Roy Bixler Daniel Black Jonathan Black Renaud Blanch +Justin Blanchard Mike Bland Martin Bless Pablo Bleyer diff --git a/Misc/NEWS.d/next/Library/2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst b/Misc/NEWS.d/next/Library/2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst new file mode 100644 index 0000000000..b958d8fed4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst @@ -0,0 +1,2 @@ +Fix error unpickling datetime.time objects from Python 2 with seconds>=24. +Patch by Justin Blanchard. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 56eaccdf17..8f4fa21da1 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4078,7 +4078,7 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } if (PyUnicode_GET_LENGTH(state) == _PyDateTime_TIME_DATASIZE && - (0x7F & PyUnicode_READ_CHAR(state, 2)) < 24) + (0x7F & PyUnicode_READ_CHAR(state, 0)) < 24) { state = PyUnicode_AsLatin1String(state); if (state == NULL) { -- 2.40.0