mirror of https://github.com/python/cpython
Verify neither dumps or loads overflow the stack and segfault.
This commit is contained in:
parent
ce15dce421
commit
cf0fab2686
|
@ -220,10 +220,30 @@ class BugsTestCase(unittest.TestCase):
|
|||
except Exception:
|
||||
pass
|
||||
|
||||
def test_recursion(self):
|
||||
def test_loads_recursion(self):
|
||||
s = 'c' + ('X' * 4*4) + '{' * 2**20
|
||||
self.assertRaises(ValueError, marshal.loads, s)
|
||||
|
||||
def test_recursion_limit(self):
|
||||
# Create a deeply nested structure.
|
||||
head = last = []
|
||||
# The max stack depth should match the value in Python/marshal.c.
|
||||
MAX_MARSHAL_STACK_DEPTH = 2000
|
||||
for i in range(MAX_MARSHAL_STACK_DEPTH - 2):
|
||||
last.append([0])
|
||||
last = last[-1]
|
||||
|
||||
# Verify we don't blow out the stack with dumps/load.
|
||||
data = marshal.dumps(head)
|
||||
new_head = marshal.loads(data)
|
||||
# Don't use == to compare objects, it can exceed the recursion limit.
|
||||
self.assertEqual(len(new_head), len(head))
|
||||
self.assertEqual(len(new_head[0]), len(head[0]))
|
||||
self.assertEqual(len(new_head[-1]), len(head[-1]))
|
||||
|
||||
last.append([0])
|
||||
self.assertRaises(ValueError, marshal.dumps, head)
|
||||
|
||||
def test_main():
|
||||
test_support.run_unittest(IntTestCase,
|
||||
FloatTestCase,
|
||||
|
|
Loading…
Reference in New Issue