Skip to content

Commit

Permalink
bpo-30570: Fix segfault on buildbots caused by stack overflow from re…
Browse files Browse the repository at this point in the history
…cursion in tests (GH-29258)

* Don't stackoveflow on debug builds

* Also catch the pickletester case
  • Loading branch information
sweeneyde committed Oct 28, 2021
1 parent 4c95fb4 commit d56375a
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 12 deletions.
3 changes: 2 additions & 1 deletion Lib/test/pickletester.py
Original file line number Diff line number Diff line change
Expand Up @@ -2383,7 +2383,8 @@ def test_bad_getattr(self):
# Issue #3514: crash when there is an infinite loop in __getattr__
x = BadGetattr()
for proto in protocols:
self.assertRaises(RuntimeError, self.dumps, x, proto)
with support.infinite_recursion():
self.assertRaises(RuntimeError, self.dumps, x, proto)

def test_reduce_bad_iterator(self):
# Issue4176: crash when 4th and 5th items of __reduce__()
Expand Down
27 changes: 16 additions & 11 deletions Lib/test/test_isinstance.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import unittest
import sys
import typing
from test import support



Expand Down Expand Up @@ -266,12 +267,14 @@ def test_subclass_tuple(self):
def test_subclass_recursion_limit(self):
# make sure that issubclass raises RecursionError before the C stack is
# blown
self.assertRaises(RecursionError, blowstack, issubclass, str, str)
with support.infinite_recursion():
self.assertRaises(RecursionError, blowstack, issubclass, str, str)

def test_isinstance_recursion_limit(self):
# make sure that issubclass raises RecursionError before the C stack is
# blown
self.assertRaises(RecursionError, blowstack, isinstance, '', str)
with support.infinite_recursion():
self.assertRaises(RecursionError, blowstack, isinstance, '', str)

def test_subclass_with_union(self):
self.assertTrue(issubclass(int, int | float | int))
Expand Down Expand Up @@ -308,27 +311,28 @@ class X:
@property
def __bases__(self):
return self.__bases__

self.assertRaises(RecursionError, issubclass, X(), int)
self.assertRaises(RecursionError, issubclass, int, X())
self.assertRaises(RecursionError, isinstance, 1, X())
with support.infinite_recursion():
self.assertRaises(RecursionError, issubclass, X(), int)
self.assertRaises(RecursionError, issubclass, int, X())
self.assertRaises(RecursionError, isinstance, 1, X())

def test_infinite_recursion_via_bases_tuple(self):
"""Regression test for bpo-30570."""
class Failure(object):
def __getattr__(self, attr):
return (self, None)

with self.assertRaises(RecursionError):
issubclass(Failure(), int)
with support.infinite_recursion():
with self.assertRaises(RecursionError):
issubclass(Failure(), int)

def test_infinite_cycle_in_bases(self):
"""Regression test for bpo-30570."""
class X:
@property
def __bases__(self):
return (self, self, self)
self.assertRaises(RecursionError, issubclass, X(), int)
with support.infinite_recursion():
self.assertRaises(RecursionError, issubclass, X(), int)

def test_infinitely_many_bases(self):
"""Regression test for bpo-30570."""
Expand All @@ -341,7 +345,8 @@ class B:
pass
A.__getattr__ = B.__getattr__ = X.__getattr__
return (A(), B())
self.assertRaises(RecursionError, issubclass, X(), int)
with support.infinite_recursion():
self.assertRaises(RecursionError, issubclass, X(), int)


def blowstack(fxn, arg, compare_to):
Expand Down

0 comments on commit d56375a

Please sign in to comment.