diff options
author | Alexey Izbyshev <izbyshev@ispras.ru> | 2018-08-20 20:04:19 (GMT) |
---|---|---|
committer | Berker Peksag <berker.peksag@gmail.com> | 2018-08-20 20:04:19 (GMT) |
commit | cdbf50cba1664f72ae6621a89c324a32fea70377 (patch) | |
tree | fd5bb4fe8e06f467a05a704f214be8b9a904d1db /Lib/test/test_abc.py | |
parent | 4c8555773a801f957297132a92c0acb382d640e4 (diff) | |
download | cpython-cdbf50cba1664f72ae6621a89c324a32fea70377.zip cpython-cdbf50cba1664f72ae6621a89c324a32fea70377.tar.gz cpython-cdbf50cba1664f72ae6621a89c324a32fea70377.tar.bz2 |
bpo-34441: Fix ABC.__subclasscheck__ crash on classes with invalid __subclasses__ (GH-8835)
The missing NULL check was reported by Svace static analyzer.
Diffstat (limited to 'Lib/test/test_abc.py')
-rw-r--r-- | Lib/test/test_abc.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index 6fc3c95..9f5afb2 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -410,6 +410,36 @@ def test_factory(abc_ABCMeta, abc_get_cache_token): with self.assertRaises(TypeError): issubclass(C(), A) + # bpo-34441: Check that issubclass() doesn't crash on bogus + # classes. + bogus_subclasses = [ + None, + lambda x: [], + lambda: 42, + lambda: [42], + ] + + for i, func in enumerate(bogus_subclasses): + class S(metaclass=abc_ABCMeta): + __subclasses__ = func + + with self.subTest(i=i): + with self.assertRaises(TypeError): + issubclass(int, S) + + # Also check that issubclass() propagates exceptions raised by + # __subclasses__. + exc_msg = "exception from __subclasses__" + + def raise_exc(): + raise Exception(exc_msg) + + class S(metaclass=abc_ABCMeta): + __subclasses__ = raise_exc + + with self.assertRaisesRegex(Exception, exc_msg): + issubclass(int, S) + def test_all_new_methods_are_called(self): class A(metaclass=abc_ABCMeta): pass |