bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24. (GH-14307)

This commit is contained in:
Justin Blanchard 2019-08-29 03:36:15 -04:00 committed by Serhiy Storchaka
parent e64f948e76
commit 122376df55
4 changed files with 22 additions and 10 deletions

View File

@ -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.

View File

@ -162,6 +162,7 @@ Roy Bixler
Daniel Black
Jonathan Black
Renaud Blanch
Justin Blanchard
Mike Bland
Martin Bless
Pablo Bleyer

View File

@ -0,0 +1,2 @@
Fix error unpickling datetime.time objects from Python 2 with seconds>=24.
Patch by Justin Blanchard.

View File

@ -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) {