bpo-41909: Enable previously disabled recursion checks. (GH-22536)

Enable recursion checks which were disabled when get __bases__ of
non-type objects in issubclass() and isinstance() and when intern
strings. It fixes a stack overflow when getting __bases__ leads
to infinite recursion.

Originally recursion checks was disabled for PyDict_GetItem() which
silences all errors including the one raised in case of detected
recursion and can return incorrect result. But now the code uses
PyDict_GetItemWithError() and PyDict_SetDefault() instead.
This commit is contained in:
Serhiy Storchaka 2020-10-05 00:55:57 +03:00 committed by GitHub
parent 619f98045d
commit 9ece9cd65c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 4 deletions

View file

@ -303,6 +303,16 @@ class TestIsInstanceIsSubclass(unittest.TestCase):
self.assertEqual(True, issubclass(B(), int))
def test_infinite_recursion_in_bases(self):
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())
def blowstack(fxn, arg, compare_to):
# Make sure that calling isinstance with a deeply nested tuple for its