bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24. (GH-14307)
This commit is contained in:
parent
e64f948e76
commit
122376df55
|
@ -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.
|
||||
|
|
|
@ -162,6 +162,7 @@ Roy Bixler
|
|||
Daniel Black
|
||||
Jonathan Black
|
||||
Renaud Blanch
|
||||
Justin Blanchard
|
||||
Mike Bland
|
||||
Martin Bless
|
||||
Pablo Bleyer
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix error unpickling datetime.time objects from Python 2 with seconds>=24.
|
||||
Patch by Justin Blanchard.
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue