diff -r 50a5e271edf9 Lib/json/tests/test_recursion.py --- a/Lib/json/tests/test_recursion.py Tue May 10 00:39:02 2011 -0700 +++ b/Lib/json/tests/test_recursion.py Tue May 10 19:16:41 2011 +0300 @@ -16,6 +16,11 @@ 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): @@ -84,3 +89,7 @@ json.loads(u'{"a":' * 100000 + u'[1]' + u'}' * 100000) with self.assertRaises(RuntimeError): json.loads(u'[' * 100000 + u'1' + u']' * 100000) + + def test_endless_recursion(self): + with self.assertRaises(RuntimeError): + EndlessJSONEncoder(check_circular=False).encode(5j) diff -r 50a5e271edf9 Modules/_json.c --- a/Modules/_json.c Tue May 10 00:39:02 2011 -0700 +++ b/Modules/_json.c Tue May 10 19:16:41 2011 +0300 @@ -2028,7 +2028,12 @@ Py_XDECREF(ident); return -1; } + + if (Py_EnterRecursiveCall(" while encoding a JSON object")) + return -1; rv = encoder_listencode_obj(s, rval, newobj, indent_level); + Py_LeaveRecursiveCall(); + Py_DECREF(newobj); if (rv) { Py_XDECREF(ident);