[Python-checkins] bpo-30570: Fix segfault on buildbots caused by stack overflow from recursion in tests (GH-29258)

miss-islington webhook-mailer at python.org
Thu Nov 4 16:45:15 EDT 2021


https://github.com/python/cpython/commit/1f3ae5c1ca5a8e7696bad414c1de38e0f5f1e2c3
commit: 1f3ae5c1ca5a8e7696bad414c1de38e0f5f1e2c3
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2021-11-04T13:45:05-07:00
summary:

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 d56375a0dd4cee162081b173310298a3d32af293)

Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com>

files:
M Lib/test/pickletester.py
M Lib/test/test_isinstance.py

diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 3e2c781caa11a..f13d42f664880 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -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__()
diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py
index 6ab44be9a26ba..9d37cff990338 100644
--- a/Lib/test/test_isinstance.py
+++ b/Lib/test/test_isinstance.py
@@ -5,6 +5,7 @@
 import unittest
 import sys
 import typing
+from test import support
 
 
 

@@ -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))
@@ -308,19 +311,19 @@ 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."""
@@ -328,7 +331,8 @@ 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."""
@@ -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):



More information about the Python-checkins mailing list