summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_abc.py
diff options
context:
space:
mode:
authorAlexey Izbyshev <izbyshev@ispras.ru>2018-08-20 20:04:19 (GMT)
committerBerker Peksag <berker.peksag@gmail.com>2018-08-20 20:04:19 (GMT)
commitcdbf50cba1664f72ae6621a89c324a32fea70377 (patch)
treefd5bb4fe8e06f467a05a704f214be8b9a904d1db /Lib/test/test_abc.py
parent4c8555773a801f957297132a92c0acb382d640e4 (diff)
downloadcpython-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.py30
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