Skip to content

Commit afde756

Browse files
authored
gh-148484: Fix memory leak of iterator in array.array constructor (GH-148523)
1 parent 769cc83 commit afde756

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

Modules/arraymodule.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3053,8 +3053,10 @@ 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;
@@ -3063,11 +3065,13 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30633065
PySequence_GetItem(initial, i);
30643066
if (v == NULL) {
30653067
Py_DECREF(a);
3068+
Py_XDECREF(it);
30663069
return NULL;
30673070
}
30683071
if (setarrayitem(a, i, v) != 0) {
30693072
Py_DECREF(v);
30703073
Py_DECREF(a);
3074+
Py_XDECREF(it);
30713075
return NULL;
30723076
}
30733077
Py_DECREF(v);
@@ -3079,6 +3083,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30793083
v = array_array_frombytes((PyObject *)a, initial);
30803084
if (v == NULL) {
30813085
Py_DECREF(a);
3086+
Py_XDECREF(it);
30823087
return NULL;
30833088
}
30843089
Py_DECREF(v);
@@ -3089,6 +3094,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
30893094
wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n);
30903095
if (ustr == NULL) {
30913096
Py_DECREF(a);
3097+
Py_XDECREF(it);
30923098
return NULL;
30933099
}
30943100

@@ -3109,6 +3115,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
31093115
Py_UCS4 *ustr = PyUnicode_AsUCS4Copy(initial);
31103116
if (ustr == NULL) {
31113117
Py_DECREF(a);
3118+
Py_XDECREF(it);
31123119
return NULL;
31133120
}
31143121

@@ -3136,6 +3143,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
31363143
return a;
31373144
}
31383145
}
3146+
Py_XDECREF(it);
31393147
PyErr_SetString(PyExc_ValueError,
31403148
"bad typecode (must be b, B, u, w, h, H, i, I, l, L, q, Q, f or d)");
31413149
return NULL;

0 commit comments

Comments
 (0)