Skip to content

Commit dc56f5f

Browse files
bpo-39590: make deque.__contains__ and deque.count hold strong references (GH-18421) (GH-18423)
(cherry picked from commit c6dedde) Co-authored-by: sweeneyde <[email protected]> Co-authored-by: sweeneyde <[email protected]>
1 parent 0c915e6 commit dc56f5f

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

Lib/test/test_deque.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,18 @@ def test_contains(self):
183183
with self.assertRaises(RuntimeError):
184184
n in d
185185

186+
def test_contains_count_stop_crashes(self):
187+
class A:
188+
def __eq__(self, other):
189+
d.clear()
190+
return NotImplemented
191+
d = deque([A(), A()])
192+
with self.assertRaises(RuntimeError):
193+
_ = 3 in d
194+
d = deque([A(), A()])
195+
with self.assertRaises(RuntimeError):
196+
_ = d.count(3)
197+
186198
def test_extend(self):
187199
d = deque('a')
188200
self.assertRaises(TypeError, d.extend, 1)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Collections.deque now holds strong references during deque.__contains__ and deque.count, fixing crashes.

Modules/_collectionsmodule.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,9 @@ deque_count(dequeobject *deque, PyObject *v)
966966
while (--n >= 0) {
967967
CHECK_NOT_END(b);
968968
item = b->data[index];
969+
Py_INCREF(item);
969970
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
971+
Py_DECREF(item);
970972
if (cmp < 0)
971973
return NULL;
972974
count += cmp;
@@ -1003,7 +1005,9 @@ deque_contains(dequeobject *deque, PyObject *v)
10031005
while (--n >= 0) {
10041006
CHECK_NOT_END(b);
10051007
item = b->data[index];
1008+
Py_INCREF(item);
10061009
cmp = PyObject_RichCompareBool(item, v, Py_EQ);
1010+
Py_DECREF(item);
10071011
if (cmp) {
10081012
return cmp;
10091013
}

0 commit comments

Comments
 (0)