diff options
| author | Serhiy Storchaka <storchaka@gmail.com> | 2015-11-23 13:20:43 (GMT) |
|---|---|---|
| committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-11-23 13:20:43 (GMT) |
| commit | 5c137669e32e84744328cd8a1f9de4efad5281d0 (patch) | |
| tree | 4476044ada30c29c374e0e0b2347ef85dd4d3610 /Lib/test/pickletester.py | |
| parent | 1456c984938afa869dfa4c460a6ddc6330d0d98b (diff) | |
| download | cpython-5c137669e32e84744328cd8a1f9de4efad5281d0.zip cpython-5c137669e32e84744328cd8a1f9de4efad5281d0.tar.gz cpython-5c137669e32e84744328cd8a1f9de4efad5281d0.tar.bz2 | |
Issue #23914: Fixed SystemError raised by unpickler on broken pickle data.
Diffstat (limited to 'Lib/test/pickletester.py')
| -rw-r--r-- | Lib/test/pickletester.py | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index d8346ea..b0a3b04 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -7,7 +7,7 @@ import cStringIO import pickletools import copy_reg -from test.test_support import TestFailed, verbose, have_unicode, TESTFN +from test.test_support import TestFailed, verbose, have_unicode, TESTFN, captured_stdout try: from test.test_support import _2G, _1M, precisionbigmemtest except ImportError: @@ -634,6 +634,78 @@ class AbstractUnpickleTests(unittest.TestCase): self.assertEqual(unpickled, ([],)*2) self.assertIs(unpickled[0], unpickled[1]) + def test_bad_stack(self): + badpickles = [ + b'0.', # POP + b'1.', # POP_MARK + b'2.', # DUP + # b'(2.', # PyUnpickler doesn't raise + b'R.', # REDUCE + b')R.', + b'a.', # APPEND + b'Na.', + b'b.', # BUILD + b'Nb.', + b'd.', # DICT + b'e.', # APPENDS + # b'(e.', # PyUnpickler raises AttributeError + b'i__builtin__\nlist\n.', # INST + b'l.', # LIST + b'o.', # OBJ + b'(o.', + b'p1\n.', # PUT + b'q\x00.', # BINPUT + b'r\x00\x00\x00\x00.', # LONG_BINPUT + b's.', # SETITEM + b'Ns.', + b'NNs.', + b't.', # TUPLE + b'u.', # SETITEMS + b'(u.', + b'}(Nu.', + b'\x81.', # NEWOBJ + b')\x81.', + b'\x85.', # TUPLE1 + b'\x86.', # TUPLE2 + b'N\x86.', + b'\x87.', # TUPLE3 + b'N\x87.', + b'NN\x87.', + ] + for p in badpickles: + try: + self.assertRaises(self.bad_stack_errors, self.loads, p) + except: + print '***', repr(p) + raise + + def test_bad_mark(self): + badpickles = [ + b'c__builtin__\nlist\n)(R.', # REDUCE + b'c__builtin__\nlist\n()R.', + b']N(a.', # APPEND + b'cexceptions\nValueError\n)R}(b.', # BUILD + b'cexceptions\nValueError\n)R(}b.', + b'(Nd.', # DICT + b'}NN(s.', # SETITEM + b'}N(Ns.', + b'c__builtin__\nlist\n)(\x81.', # NEWOBJ + b'c__builtin__\nlist\n()\x81.', + b'N(\x85.', # TUPLE1 + b'NN(\x86.', # TUPLE2 + b'N(N\x86.', + b'NNN(\x87.', # TUPLE3 + b'NN(N\x87.', + b'N(NN\x87.', + ] + for p in badpickles: + # PyUnpickler prints reduce errors to stdout + try: + self.loads(p) + except (IndexError, AttributeError, TypeError, + pickle.UnpicklingError): + pass + class AbstractPickleTests(unittest.TestCase): # Subclass must define self.dumps, self.loads. |
