Issue #5308: Raise ValueError when marshalling too large object (a sequence
with size >= 2**31), instead of producing illegal marshal data.
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
index 96a70ec..02ef62a 100644
--- a/Lib/test/test_marshal.py
+++ b/Lib/test/test_marshal.py
@@ -262,16 +262,63 @@
         unicode_string = 'T'
         self.assertRaises(TypeError, marshal.loads, unicode_string)
 
+LARGE_SIZE = 2**31
+character_size = 4 if sys.maxunicode > 0xFFFF else 2
+pointer_size = 8 if sys.maxsize > 0xFFFFFFFF else 4
+
+class NullWriter:
+    def write(self, s):
+        pass
+
+@unittest.skipIf(LARGE_SIZE > sys.maxsize, "test cannot run on 32-bit systems")
+class LargeValuesTestCase(unittest.TestCase):
+    def check_unmarshallable(self, data):
+        self.assertRaises(ValueError, marshal.dump, data, NullWriter())
+
+    @support.bigmemtest(size=LARGE_SIZE, memuse=1, dry_run=False)
+    def test_bytes(self, size):
+        self.check_unmarshallable(b'x' * size)
+
+    @support.bigmemtest(size=LARGE_SIZE, memuse=character_size, dry_run=False)
+    def test_str(self, size):
+        self.check_unmarshallable('x' * size)
+
+    @support.bigmemtest(size=LARGE_SIZE, memuse=pointer_size, dry_run=False)
+    def test_tuple(self, size):
+        self.check_unmarshallable((None,) * size)
+
+    @support.bigmemtest(size=LARGE_SIZE, memuse=pointer_size, dry_run=False)
+    def test_list(self, size):
+        self.check_unmarshallable([None] * size)
+
+    @support.bigmemtest(size=LARGE_SIZE,
+            memuse=pointer_size*12 + sys.getsizeof(LARGE_SIZE-1),
+            dry_run=False)
+    def test_set(self, size):
+        self.check_unmarshallable(set(range(size)))
+
+    @support.bigmemtest(size=LARGE_SIZE,
+            memuse=pointer_size*12 + sys.getsizeof(LARGE_SIZE-1),
+            dry_run=False)
+    def test_frozenset(self, size):
+        self.check_unmarshallable(frozenset(range(size)))
+
+    @support.bigmemtest(size=LARGE_SIZE, memuse=1, dry_run=False)
+    def test_bytearray(self, size):
+        self.check_unmarshallable(bytearray(size))
+
 
 def test_main():
     support.run_unittest(IntTestCase,
-                              FloatTestCase,
-                              StringTestCase,
-                              CodeTestCase,
-                              ContainerTestCase,
-                              ExceptionTestCase,
-                              BufferTestCase,
-                              BugsTestCase)
+                         FloatTestCase,
+                         StringTestCase,
+                         CodeTestCase,
+                         ContainerTestCase,
+                         ExceptionTestCase,
+                         BufferTestCase,
+                         BugsTestCase,
+                         LargeValuesTestCase,
+                        )
 
 if __name__ == "__main__":
     test_main()