mirror of https://github.com/python/cpython
Fix a possible segfault from recursing too deep to get the repr of a list.
Closes issue #1096.
This commit is contained in:
parent
f3d280e62a
commit
a0c05512ec
|
@ -46,6 +46,11 @@ class CommonTest(seq_tests.CommonTest):
|
|||
self.assertEqual(str(a2), "[0, 1, 2, [...], 3]")
|
||||
self.assertEqual(repr(a2), "[0, 1, 2, [...], 3]")
|
||||
|
||||
l0 = []
|
||||
for i in xrange(sys.getrecursionlimit() + 100):
|
||||
l0 = [l0]
|
||||
self.assertRaises(RuntimeError, repr, l0)
|
||||
|
||||
def test_print(self):
|
||||
d = self.type2test(xrange(200))
|
||||
d.append(d)
|
||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1?
|
|||
Core and builtins
|
||||
-----------------
|
||||
|
||||
- Issue #1096: Prevent a segfault from getting the repr of a very deeply nested
|
||||
list by using the recursion counter.
|
||||
|
||||
- Issue #1202533: Fix infinite recursion calls triggered by calls to
|
||||
PyObject_Call() never calling back out to Python code to trigger recursion
|
||||
depth updates/checks. Required the creation of a static RuntimeError
|
||||
|
|
|
@ -324,7 +324,10 @@ list_repr(PyListObject *v)
|
|||
so must refetch the list size on each iteration. */
|
||||
for (i = 0; i < Py_Size(v); ++i) {
|
||||
int status;
|
||||
if (Py_EnterRecursiveCall(" while getting the repr of a list"))
|
||||
goto Done;
|
||||
s = PyObject_Repr(v->ob_item[i]);
|
||||
Py_LeaveRecursiveCall();
|
||||
if (s == NULL)
|
||||
goto Done;
|
||||
status = PyList_Append(pieces, s);
|
||||
|
|
Loading…
Reference in New Issue