Skip to content

Commit 1f3ae5c

Browse files
bpo-30570: Fix segfault on buildbots caused by stack overflow from recursion in tests (GH-29258)
* Don't stackoveflow on debug builds * Also catch the pickletester case (cherry picked from commit d56375a) Co-authored-by: Dennis Sweeney <[email protected]>
1 parent c0f3281 commit 1f3ae5c

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

Lib/test/pickletester.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2383,7 +2383,8 @@ def test_bad_getattr(self):
23832383
# Issue #3514: crash when there is an infinite loop in __getattr__
23842384
x = BadGetattr()
23852385
for proto in protocols:
2386-
self.assertRaises(RuntimeError, self.dumps, x, proto)
2386+
with support.infinite_recursion():
2387+
self.assertRaises(RuntimeError, self.dumps, x, proto)
23872388

23882389
def test_reduce_bad_iterator(self):
23892390
# Issue4176: crash when 4th and 5th items of __reduce__()

Lib/test/test_isinstance.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import unittest
66
import sys
77
import typing
8+
from test import support
89

910

1011

@@ -266,12 +267,14 @@ def test_subclass_tuple(self):
266267
def test_subclass_recursion_limit(self):
267268
# make sure that issubclass raises RecursionError before the C stack is
268269
# blown
269-
self.assertRaises(RecursionError, blowstack, issubclass, str, str)
270+
with support.infinite_recursion():
271+
self.assertRaises(RecursionError, blowstack, issubclass, str, str)
270272

271273
def test_isinstance_recursion_limit(self):
272274
# make sure that issubclass raises RecursionError before the C stack is
273275
# blown
274-
self.assertRaises(RecursionError, blowstack, isinstance, '', str)
276+
with support.infinite_recursion():
277+
self.assertRaises(RecursionError, blowstack, isinstance, '', str)
275278

276279
def test_subclass_with_union(self):
277280
self.assertTrue(issubclass(int, int | float | int))
@@ -308,27 +311,28 @@ class X:
308311
@property
309312
def __bases__(self):
310313
return self.__bases__
311-
312-
self.assertRaises(RecursionError, issubclass, X(), int)
313-
self.assertRaises(RecursionError, issubclass, int, X())
314-
self.assertRaises(RecursionError, isinstance, 1, X())
314+
with support.infinite_recursion():
315+
self.assertRaises(RecursionError, issubclass, X(), int)
316+
self.assertRaises(RecursionError, issubclass, int, X())
317+
self.assertRaises(RecursionError, isinstance, 1, X())
315318

316319
def test_infinite_recursion_via_bases_tuple(self):
317320
"""Regression test for bpo-30570."""
318321
class Failure(object):
319322
def __getattr__(self, attr):
320323
return (self, None)
321-
322-
with self.assertRaises(RecursionError):
323-
issubclass(Failure(), int)
324+
with support.infinite_recursion():
325+
with self.assertRaises(RecursionError):
326+
issubclass(Failure(), int)
324327

325328
def test_infinite_cycle_in_bases(self):
326329
"""Regression test for bpo-30570."""
327330
class X:
328331
@property
329332
def __bases__(self):
330333
return (self, self, self)
331-
self.assertRaises(RecursionError, issubclass, X(), int)
334+
with support.infinite_recursion():
335+
self.assertRaises(RecursionError, issubclass, X(), int)
332336

333337
def test_infinitely_many_bases(self):
334338
"""Regression test for bpo-30570."""
@@ -341,7 +345,8 @@ class B:
341345
pass
342346
A.__getattr__ = B.__getattr__ = X.__getattr__
343347
return (A(), B())
344-
self.assertRaises(RecursionError, issubclass, X(), int)
348+
with support.infinite_recursion():
349+
self.assertRaises(RecursionError, issubclass, X(), int)
345350

346351

347352
def blowstack(fxn, arg, compare_to):

0 commit comments

Comments
 (0)