mirror of
https://github.com/python/cpython.git
synced 2025-08-17 07:11:51 +00:00
#12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
This commit is contained in:
parent
47d1d0dc30
commit
c1ec7b5d44
3 changed files with 39 additions and 3 deletions
|
@ -16,6 +16,11 @@ class RecursiveJSONEncoder(json.JSONEncoder):
|
|||
return 'JSONTestObject'
|
||||
return json.JSONEncoder.default(o)
|
||||
|
||||
class EndlessJSONEncoder(json.JSONEncoder):
|
||||
def default(self, o):
|
||||
"""If check_circular is False, this will keep adding another list."""
|
||||
return [o]
|
||||
|
||||
|
||||
class TestRecursion(TestCase):
|
||||
def test_listrecursion(self):
|
||||
|
@ -67,7 +72,7 @@ class TestRecursion(TestCase):
|
|||
self.fail("didn't raise ValueError on default recursion")
|
||||
|
||||
|
||||
def test_highly_nested_objects(self):
|
||||
def test_highly_nested_objects_decoding(self):
|
||||
# test that loading highly-nested objects doesn't segfault when C
|
||||
# accelerations are used. See #12017
|
||||
# str
|
||||
|
@ -84,3 +89,18 @@ class TestRecursion(TestCase):
|
|||
json.loads(u'{"a":' * 100000 + u'[1]' + u'}' * 100000)
|
||||
with self.assertRaises(RuntimeError):
|
||||
json.loads(u'[' * 100000 + u'1' + u']' * 100000)
|
||||
|
||||
def test_highly_nested_objects_encoding(self):
|
||||
# See #12051
|
||||
l, d = [], {}
|
||||
for x in xrange(100000):
|
||||
l, d = [l], {'k':d}
|
||||
with self.assertRaises(RuntimeError):
|
||||
json.dumps(l)
|
||||
with self.assertRaises(RuntimeError):
|
||||
json.dumps(d)
|
||||
|
||||
def test_endless_recursion(self):
|
||||
# See #12051
|
||||
with self.assertRaises(RuntimeError):
|
||||
EndlessJSONEncoder(check_circular=False).encode(5j)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue