Skip to content

Commit 19395c3

Browse files
committed
gh-148484: Fix iterator leak in array.array constructor
1 parent 5d65de7 commit 19395c3

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

Modules/arraymodule.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3053,14 +3053,15 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30533053
len = 0;
30543054

30553055
a = newarrayobject(type, len, descr);
3056-
if (a == NULL)
3056+
if (a == NULL) {
3057+
Py_XDECREF(it);
30573058
return NULL;
3059+
}
30583060

30593061
if (len > 0 && !array_Check(initial, state)) {
30603062
Py_ssize_t i;
30613063
for (i = 0; i < len; i++) {
3062-
PyObject *v =
3063-
PySequence_GetItem(initial, i);
3064+
PyObject *v = PySequence_GetItem(initial, i);
30643065
if (v == NULL) {
30653066
Py_DECREF(a);
30663067
Py_XDECREF(it);
@@ -3081,6 +3082,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30813082
v = array_array_frombytes((PyObject *)a, initial);
30823083
if (v == NULL) {
30833084
Py_DECREF(a);
3085+
Py_XDECREF(it);
30843086
return NULL;
30853087
}
30863088
Py_DECREF(v);
@@ -3091,6 +3093,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30913093
wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n);
30923094
if (ustr == NULL) {
30933095
Py_DECREF(a);
3096+
Py_XDECREF(it);
30943097
return NULL;
30953098
}
30963099

@@ -3111,6 +3114,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
31113114
Py_UCS4 *ustr = PyUnicode_AsUCS4Copy(initial);
31123115
if (ustr == NULL) {
31133116
Py_DECREF(a);
3117+
Py_XDECREF(it);
31143118
return NULL;
31153119
}
31163120

@@ -3138,6 +3142,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
31383142
return a;
31393143
}
31403144
}
3145+
Py_XDECREF(it);
31413146
PyErr_SetString(PyExc_ValueError,
31423147
"bad typecode (must be b, B, u, w, h, H, i, I, l, L, q, Q, f or d)");
31433148
return NULL;

0 commit comments

Comments
 (0)