Skip to content

Commit 8134984

Browse files
[3.13] gh-148484: Fix memory leak of iterator in array.array constructor (GH-148523) (GH-148679)
(cherry picked from commit afde756) Co-authored-by: Gleb Popov <gvpopov.dev@gmail.com>
1 parent 3c59b8b commit 8134984

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

Modules/arraymodule.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2821,8 +2821,10 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28212821
len = 0;
28222822

28232823
a = newarrayobject(type, len, descr);
2824-
if (a == NULL)
2824+
if (a == NULL) {
2825+
Py_XDECREF(it);
28252826
return NULL;
2827+
}
28262828

28272829
if (len > 0 && !array_Check(initial, state)) {
28282830
Py_ssize_t i;
@@ -2831,11 +2833,13 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28312833
PySequence_GetItem(initial, i);
28322834
if (v == NULL) {
28332835
Py_DECREF(a);
2836+
Py_XDECREF(it);
28342837
return NULL;
28352838
}
28362839
if (setarrayitem(a, i, v) != 0) {
28372840
Py_DECREF(v);
28382841
Py_DECREF(a);
2842+
Py_XDECREF(it);
28392843
return NULL;
28402844
}
28412845
Py_DECREF(v);
@@ -2848,6 +2852,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28482852
initial);
28492853
if (v == NULL) {
28502854
Py_DECREF(a);
2855+
Py_XDECREF(it);
28512856
return NULL;
28522857
}
28532858
Py_DECREF(v);
@@ -2858,6 +2863,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28582863
wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n);
28592864
if (ustr == NULL) {
28602865
Py_DECREF(a);
2866+
Py_XDECREF(it);
28612867
return NULL;
28622868
}
28632869

@@ -2878,6 +2884,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28782884
Py_UCS4 *ustr = PyUnicode_AsUCS4Copy(initial);
28792885
if (ustr == NULL) {
28802886
Py_DECREF(a);
2887+
Py_XDECREF(it);
28812888
return NULL;
28822889
}
28832890

@@ -2905,6 +2912,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
29052912
return a;
29062913
}
29072914
}
2915+
Py_XDECREF(it);
29082916
PyErr_SetString(PyExc_ValueError,
29092917
"bad typecode (must be b, B, u, w, h, H, i, I, l, L, q, Q, f or d)");
29102918
return NULL;

0 commit comments

Comments
 (0)