From 83c2bde72a9572d156926dbfded345b585ac8195 Mon Sep 17 00:00:00 2001 From: Justin Blanchard Date: Sat, 22 Jun 2019 12:38:28 -0400 Subject: [PATCH 1/4] bpo-37372: Fix errors unpickling certain datetime.time objects from Python 2. --- Lib/test/datetimetester.py | 16 ++++++++-------- .../2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst | 1 + Modules/_datetimemodule.c | 2 +- 3 files changed, 10 insertions(+), 9 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 53de0658773c7b..fc8538cf9f7223 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3288,11 +3288,11 @@ def test_pickling_subclass_time(self): 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;\\x19\\x00\\x10\\x00'\ntR.", + b'cdatetime\ntime\n(U\x06\x14;\x19\x00\x10\x00tR.', + b'\x80\x02cdatetime\ntime\nU\x06\x14;\x19\x00\x10\x00\x85R.', ] - args = 20, 59, 16, 64**2 + args = 20, 59, 25, 64**2 expected = self.theclass(*args) for data in tests: for loads in pickle_loads: @@ -3673,21 +3673,21 @@ def test_pickling(self): def test_compat_unpickle(self): tests = [ - b"cdatetime\ntime\n(S'\\x05\\x06\\x07\\x01\\xe2@'\n" + b"cdatetime\ntime\n(S'\\x05\\x16\\x17\\x01\\xe2@'\n" b"ctest.datetimetester\nPicklableFixedOffset\n(tR" b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" b"(I-1\nI68400\nI0\ntRs" b"S'_FixedOffset__dstoffset'\nNs" b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", - b'cdatetime\ntime\n(U\x06\x05\x06\x07\x01\xe2@' + b'cdatetime\ntime\n(U\x06\x05\x16\x17\x01\xe2@' b'ctest.datetimetester\nPicklableFixedOffset\n)R' b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' b'U\x17_FixedOffset__dstoffsetN' b'U\x12_FixedOffset__nameU\x06cookieubtR.', - b'\x80\x02cdatetime\ntime\nU\x06\x05\x06\x07\x01\xe2@' + b'\x80\x02cdatetime\ntime\nU\x06\x05\x16\x17\x01\xe2@' b'ctest.datetimetester\nPicklableFixedOffset\n)R' b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' @@ -3696,7 +3696,7 @@ def test_compat_unpickle(self): ] tinfo = PicklableFixedOffset(-300, 'cookie') - expected = self.theclass(5, 6, 7, 123456, tzinfo=tinfo) + expected = self.theclass(5, 22, 23, 123456, tzinfo=tinfo) for data in tests: for loads in pickle_loads: derived = loads(data, encoding='latin1') 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 00000000000000..11af3282fa6fd7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst @@ -0,0 +1 @@ +Fix errors unpickling certain datetime.time objects from Python 2. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 2e0211cbbef801..959ead8c3bcdd7 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4079,7 +4079,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) { From da578ce6bb12cc94814b9b5fa885bff088b2a429 Mon Sep 17 00:00:00 2001 From: Justin Blanchard Date: Mon, 24 Jun 2019 07:59:18 -0400 Subject: [PATCH 2/4] bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24 - requested doc update --- Misc/ACKS | 1 + .../next/Library/2019-06-22-12-30-00.bpo-37372.kIKqZ6.rst | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Misc/ACKS b/Misc/ACKS index 05a3e61f694149..95bdbdf54bbcf3 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 index 11af3282fa6fd7..b958d8fed40a85 100644 --- 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 @@ -1 +1,2 @@ -Fix errors unpickling certain datetime.time objects from Python 2. +Fix error unpickling datetime.time objects from Python 2 with seconds>=24. +Patch by Justin Blanchard. From 9b659268d3d88816065e4c62b117b376df55fcef Mon Sep 17 00:00:00 2001 From: Justin Blanchard Date: Mon, 24 Jun 2019 08:05:29 -0400 Subject: [PATCH 3/4] bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24 - test with an additive change --- Lib/test/datetimetester.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index fc8538cf9f7223..a50e214336fd88 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3288,16 +3288,19 @@ def test_pickling_subclass_time(self): def test_compat_unpickle(self): tests = [ - b"cdatetime\ntime\n(S'\\x14;\\x19\\x00\\x10\\x00'\ntR.", - b'cdatetime\ntime\n(U\x06\x14;\x19\x00\x10\x00tR.', - b'\x80\x02cdatetime\ntime\nU\x06\x14;\x19\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, 25, 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. @@ -3673,21 +3676,21 @@ def test_pickling(self): def test_compat_unpickle(self): tests = [ - b"cdatetime\ntime\n(S'\\x05\\x16\\x17\\x01\\xe2@'\n" + b"cdatetime\ntime\n(S'\\x05\\x06\\x07\\x01\\xe2@'\n" b"ctest.datetimetester\nPicklableFixedOffset\n(tR" b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" b"(I-1\nI68400\nI0\ntRs" b"S'_FixedOffset__dstoffset'\nNs" b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", - b'cdatetime\ntime\n(U\x06\x05\x16\x17\x01\xe2@' + b'cdatetime\ntime\n(U\x06\x05\x06\x07\x01\xe2@' b'ctest.datetimetester\nPicklableFixedOffset\n)R' b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' b'U\x17_FixedOffset__dstoffsetN' b'U\x12_FixedOffset__nameU\x06cookieubtR.', - b'\x80\x02cdatetime\ntime\nU\x06\x05\x16\x17\x01\xe2@' + b'\x80\x02cdatetime\ntime\nU\x06\x05\x06\x07\x01\xe2@' b'ctest.datetimetester\nPicklableFixedOffset\n)R' b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' @@ -3696,7 +3699,7 @@ def test_compat_unpickle(self): ] tinfo = PicklableFixedOffset(-300, 'cookie') - expected = self.theclass(5, 22, 23, 123456, tzinfo=tinfo) + expected = self.theclass(5, 6, 7, 123456, tzinfo=tinfo) for data in tests: for loads in pickle_loads: derived = loads(data, encoding='latin1') From 0a53a457d3cd6dd6f0ea75d4c5dcf43b26f97070 Mon Sep 17 00:00:00 2001 From: Justin Blanchard Date: Mon, 24 Jun 2019 19:30:05 -0400 Subject: [PATCH 4/4] bpo-37372: Fix error unpickling datetime.time objects from Python 2 with seconds>=24 - split long lines --- Lib/test/datetimetester.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index a50e214336fd88..4b6205df9d91cf 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3288,12 +3288,18 @@ def test_pickling_subclass_time(self): def test_compat_unpickle(self): tests = [ - (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)), + (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)), ] for i, (data, args) in enumerate(tests): with self.subTest(i=i): pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy