Skip to content

Commit 6b50c10

Browse files
bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24. (GH-14307)
(cherry picked from commit 122376d) Co-authored-by: Justin Blanchard <[email protected]>
1 parent d3d2650 commit 6b50c10

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

Lib/test/datetimetester.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3185,16 +3185,25 @@ def test_pickling_subclass_time(self):
31853185

31863186
def test_compat_unpickle(self):
31873187
tests = [
3188-
b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.",
3189-
b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.',
3190-
b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.',
3188+
(b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.",
3189+
(20, 59, 16, 64**2)),
3190+
(b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.',
3191+
(20, 59, 16, 64**2)),
3192+
(b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.',
3193+
(20, 59, 16, 64**2)),
3194+
(b"cdatetime\ntime\n(S'\\x14;\\x19\\x00\\x10\\x00'\ntR.",
3195+
(20, 59, 25, 64**2)),
3196+
(b'cdatetime\ntime\n(U\x06\x14;\x19\x00\x10\x00tR.',
3197+
(20, 59, 25, 64**2)),
3198+
(b'\x80\x02cdatetime\ntime\nU\x06\x14;\x19\x00\x10\x00\x85R.',
3199+
(20, 59, 25, 64**2)),
31913200
]
3192-
args = 20, 59, 16, 64**2
3193-
expected = self.theclass(*args)
3194-
for data in tests:
3195-
for loads in pickle_loads:
3196-
derived = loads(data, encoding='latin1')
3197-
self.assertEqual(derived, expected)
3201+
for i, (data, args) in enumerate(tests):
3202+
with self.subTest(i=i):
3203+
expected = self.theclass(*args)
3204+
for loads in pickle_loads:
3205+
derived = loads(data, encoding='latin1')
3206+
self.assertEqual(derived, expected)
31983207

31993208
def test_bool(self):
32003209
# time is always True.

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ Roy Bixler
160160
Daniel Black
161161
Jonathan Black
162162
Renaud Blanch
163+
Justin Blanchard
163164
Mike Bland
164165
Martin Bless
165166
Pablo Bleyer
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix error unpickling datetime.time objects from Python 2 with seconds>=24.
2+
Patch by Justin Blanchard.

Modules/_datetimemodule.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3982,7 +3982,7 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw)
39823982
return NULL;
39833983
}
39843984
if (PyUnicode_GET_LENGTH(state) == _PyDateTime_TIME_DATASIZE &&
3985-
(0x7F & PyUnicode_READ_CHAR(state, 2)) < 24)
3985+
(0x7F & PyUnicode_READ_CHAR(state, 0)) < 24)
39863986
{
39873987
state = PyUnicode_AsLatin1String(state);
39883988
if (state == NULL) {

0 commit comments

Comments
 (0)