bpo-39453: Make list.__contains__ hold strong references to avoid crashes (GH-18181)

This commit is contained in:
Dong-hee Na 2020-01-28 00:02:23 +09:00 committed by Pablo Galindo
parent a46575a8f2
commit 4dbf2d8c67
3 changed files with 13 additions and 1 deletions

View File

@ -221,6 +221,11 @@ class ListTest(list_tests.CommonTest):
with self.assertRaises(ValueError):
lst.remove(lst)
# bpo-39453: list.__contains__ was not holding strong references
# to list elements while calling PyObject_RichCompareBool().
lst = [X(), X()]
3 in lst
if __name__ == "__main__":
unittest.main()

View File

@ -0,0 +1,2 @@
Fixed a possible crash in :meth:`list.__contains__` when a list is changed
during comparing items. Patch by Dong-hee Na.

View File

@ -445,11 +445,16 @@ list_length(PyListObject *a)
static int
list_contains(PyListObject *a, PyObject *el)
{
PyObject *item;
Py_ssize_t i;
int cmp;
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) {
item = PyList_GET_ITEM(a, i);
Py_INCREF(item);
cmp = PyObject_RichCompareBool(PyList_GET_ITEM(a, i), el, Py_EQ);
Py_DECREF(item);
}
return cmp;
}