summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na92@gmail.com>2019-12-31 10:04:22 +0900
committerPablo Galindo <Pablogsal@gmail.com>2019-12-31 01:04:22 +0000
commit2d5bf568eaa5059402ccce9ba5a366986ba27c8a (patch)
tree04fe688caaa82e948cc4ff315fe82453f3445b6e /Lib
parentee9ff05ec22ecd47dbffdd361967ccd55963dad2 (diff)
downloadcpython-git-2d5bf568eaa5059402ccce9ba5a366986ba27c8a.tar.gz
bpo-38588: Fix possible crashes in dict and list when calling PyObject_RichCompareBool (GH-17734)
Take strong references before calling PyObject_RichCompareBool to protect against the case where the object dies during the call.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_dict.py12
-rw-r--r--Lib/test/test_list.py25
2 files changed, 36 insertions, 1 deletions
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index 5b513765f7..de483ab552 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -1221,7 +1221,7 @@ class DictTest(unittest.TestCase):
support.check_free_after_iterating(self, lambda d: iter(d.items()), dict)
def test_equal_operator_modifying_operand(self):
- # test fix for seg fault reported in issue 27945 part 3.
+ # test fix for seg fault reported in bpo-27945 part 3.
class X():
def __del__(self):
dict_b.clear()
@@ -1237,6 +1237,16 @@ class DictTest(unittest.TestCase):
dict_b = {X(): X()}
self.assertTrue(dict_a == dict_b)
+ # test fix for seg fault reported in bpo-38588 part 1.
+ class Y:
+ def __eq__(self, other):
+ dict_d.clear()
+ return True
+
+ dict_c = {0: Y()}
+ dict_d = {0: set()}
+ self.assertTrue(dict_c == dict_d)
+
def test_fromkeys_operator_modifying_dict_operand(self):
# test fix for seg fault reported in issue 27945 part 4a.
class X(int):
diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py
index b10a833033..6e3c4c1093 100644
--- a/Lib/test/test_list.py
+++ b/Lib/test/test_list.py
@@ -163,6 +163,31 @@ class ListTest(list_tests.CommonTest):
with self.assertRaises(TypeError):
(3,) + L([1,2])
+ def test_equal_operator_modifying_operand(self):
+ # test fix for seg fault reported in bpo-38588 part 2.
+ class X:
+ def __eq__(self,other) :
+ list2.clear()
+ return NotImplemented
+
+ class Y:
+ def __eq__(self, other):
+ list1.clear()
+ return NotImplemented
+
+ class Z:
+ def __eq__(self, other):
+ list3.clear()
+ return NotImplemented
+
+ list1 = [X()]
+ list2 = [Y()]
+ self.assertTrue(list1 == list2)
+
+ list3 = [Z()]
+ list4 = [1]
+ self.assertFalse(list3 == list4)
+
@cpython_only
def test_preallocation(self):
iterable = [0] * 10