From: Brett Cannon Date: Mon, 10 Sep 2007 21:38:27 +0000 (+0000) Subject: Fix a possible segfault from recursing too deep to get the repr of a list. X-Git-Tag: v2.6a1~1316 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a0c05512ec071b98e8170c8cfe845bee6fc934da;p=python Fix a possible segfault from recursing too deep to get the repr of a list. Closes issue #1096. --- diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index 1c799d760e..a0011a46fb 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 99e4f07131..10f2c71e7c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 diff --git a/Objects/listobject.c b/Objects/listobject.c index c0621dce91..92bad8c7c8 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -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);