Issue #23914: Fixed SystemError raised by unpickler on broken pickle data.
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 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 @@
         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.