diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-09-29 19:10:07 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-09-29 19:10:07 (GMT) |
commit | e060619d4b047fdee613cafc64e3a9242a68ea54 (patch) | |
tree | 11c55e928773fe9e11be79432c5d28606290c137 /Lib | |
parent | d455a50773eb1f4531882a0b99ff7a253ad1d41e (diff) | |
download | cpython-e060619d4b047fdee613cafc64e3a9242a68ea54.zip cpython-e060619d4b047fdee613cafc64e3a9242a68ea54.tar.gz cpython-e060619d4b047fdee613cafc64e3a9242a68ea54.tar.bz2 |
Issue #25262. Added support for BINBYTES8 opcode in Python implementation of
unpickler. Highest 32 bits of 64-bit size for BINUNICODE8 and BINBYTES8
opcodes no longer silently ignored on 32-bit platforms in C implementation.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/pickle.py | 8 | ||||
-rw-r--r-- | Lib/test/pickletester.py | 20 |
2 files changed, 28 insertions, 0 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py index 67382ae..c7298af 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1204,6 +1204,14 @@ class _Unpickler: self.append(str(self.read(len), 'utf-8', 'surrogatepass')) dispatch[BINUNICODE8[0]] = load_binunicode8 + def load_binbytes8(self): + len, = unpack('<Q', self.read(8)) + if len > maxsize: + raise UnpicklingError("BINBYTES8 exceeds system's maximum size " + "of %d bytes" % maxsize) + self.append(self.read(len)) + dispatch[BINBYTES8[0]] = load_binbytes8 + def load_short_binstring(self): len = self.read(1)[0] data = self.read(len) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index a0ee168..c6f4f6c 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -857,6 +857,26 @@ class AbstractUnpickleTests(unittest.TestCase): self.assert_is_copy([(100,), (100,)], self.loads(b'((Kdtp0\nh\x00l.))')) + def test_binbytes8(self): + dumped = b'\x80\x04\x8e\4\0\0\0\0\0\0\0\xe2\x82\xac\x00.' + self.assertEqual(self.loads(dumped), b'\xe2\x82\xac\x00') + + def test_binunicode8(self): + dumped = b'\x80\x04\x8d\4\0\0\0\0\0\0\0\xe2\x82\xac\x00.' + self.assertEqual(self.loads(dumped), '\u20ac\x00') + + @requires_32b + def test_large_32b_binbytes8(self): + dumped = b'\x80\x04\x8e\4\0\0\0\1\0\0\0\xe2\x82\xac\x00.' + with self.assertRaises((pickle.UnpicklingError, OverflowError)): + self.loads(dumped) + + @requires_32b + def test_large_32b_binunicode8(self): + dumped = b'\x80\x04\x8d\4\0\0\0\1\0\0\0\xe2\x82\xac\x00.' + with self.assertRaises((pickle.UnpicklingError, OverflowError)): + self.loads(dumped) + def test_get(self): pickled = b'((lp100000\ng100000\nt.' unpickled = self.loads(pickled) |