Skip to content

Commit 0b142e2

Browse files
committed
Issue #18408: Fix array_index(), handle getarrayitem() failure
1 parent 08a80b1 commit 0b142e2

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

Modules/arraymodule.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -968,8 +968,13 @@ array_count(arrayobject *self, PyObject *v)
968968
Py_ssize_t i;
969969

970970
for (i = 0; i < Py_SIZE(self); i++) {
971-
PyObject *selfi = getarrayitem((PyObject *)self, i);
972-
int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
971+
PyObject *selfi;
972+
int cmp;
973+
974+
selfi = getarrayitem((PyObject *)self, i);
975+
if (selfi == NULL)
976+
return NULL;
977+
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
973978
Py_DECREF(selfi);
974979
if (cmp > 0)
975980
count++;
@@ -990,8 +995,13 @@ array_index(arrayobject *self, PyObject *v)
990995
Py_ssize_t i;
991996

992997
for (i = 0; i < Py_SIZE(self); i++) {
993-
PyObject *selfi = getarrayitem((PyObject *)self, i);
994-
int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
998+
PyObject *selfi;
999+
int cmp;
1000+
1001+
selfi = getarrayitem((PyObject *)self, i);
1002+
if (selfi == NULL)
1003+
return NULL;
1004+
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
9951005
Py_DECREF(selfi);
9961006
if (cmp > 0) {
9971007
return PyLong_FromLong((long)i);
@@ -1016,6 +1026,8 @@ array_contains(arrayobject *self, PyObject *v)
10161026

10171027
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
10181028
PyObject *selfi = getarrayitem((PyObject *)self, i);
1029+
if (selfi == NULL)
1030+
return NULL;
10191031
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
10201032
Py_DECREF(selfi);
10211033
}
@@ -1028,8 +1040,13 @@ array_remove(arrayobject *self, PyObject *v)
10281040
int i;
10291041

10301042
for (i = 0; i < Py_SIZE(self); i++) {
1031-
PyObject *selfi = getarrayitem((PyObject *)self,i);
1032-
int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1043+
PyObject *selfi;
1044+
int cmp;
1045+
1046+
selfi = getarrayitem((PyObject *)self,i);
1047+
if (selfi == NULL)
1048+
return NULL;
1049+
cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
10331050
Py_DECREF(selfi);
10341051
if (cmp > 0) {
10351052
if (array_ass_slice(self, i, i+1,
@@ -1068,7 +1085,9 @@ array_pop(arrayobject *self, PyObject *args)
10681085
PyErr_SetString(PyExc_IndexError, "pop index out of range");
10691086
return NULL;
10701087
}
1071-
v = getarrayitem((PyObject *)self,i);
1088+
v = getarrayitem((PyObject *)self, i);
1089+
if (v == NULL)
1090+
return NULL;
10721091
if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
10731092
Py_DECREF(v);
10741093
return NULL;

0 commit comments

Comments
 (0)