Skip to content

Commit 0f656e2

Browse files
[3.14] gh-148484: Fix memory leak of iterator in array.array constructor (GH-148523) (GH-148678)
(cherry picked from commit afde756) Co-authored-by: Gleb Popov <gvpopov.dev@gmail.com>
1 parent 5e758ff commit 0f656e2

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
@@ -2854,8 +2854,10 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28542854
len = 0;
28552855

28562856
a = newarrayobject(type, len, descr);
2857-
if (a == NULL)
2857+
if (a == NULL) {
2858+
Py_XDECREF(it);
28582859
return NULL;
2860+
}
28592861

28602862
if (len > 0 && !array_Check(initial, state)) {
28612863
Py_ssize_t i;
@@ -2864,11 +2866,13 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28642866
PySequence_GetItem(initial, i);
28652867
if (v == NULL) {
28662868
Py_DECREF(a);
2869+
Py_XDECREF(it);
28672870
return NULL;
28682871
}
28692872
if (setarrayitem(a, i, v) != 0) {
28702873
Py_DECREF(v);
28712874
Py_DECREF(a);
2875+
Py_XDECREF(it);
28722876
return NULL;
28732877
}
28742878
Py_DECREF(v);
@@ -2880,6 +2884,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28802884
v = array_array_frombytes((PyObject *)a, initial);
28812885
if (v == NULL) {
28822886
Py_DECREF(a);
2887+
Py_XDECREF(it);
28832888
return NULL;
28842889
}
28852890
Py_DECREF(v);
@@ -2890,6 +2895,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
28902895
wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n);
28912896
if (ustr == NULL) {
28922897
Py_DECREF(a);
2898+
Py_XDECREF(it);
28932899
return NULL;
28942900
}
28952901

@@ -2910,6 +2916,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
29102916
Py_UCS4 *ustr = PyUnicode_AsUCS4Copy(initial);
29112917
if (ustr == NULL) {
29122918
Py_DECREF(a);
2919+
Py_XDECREF(it);
29132920
return NULL;
29142921
}
29152922

@@ -2937,6 +2944,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
29372944
return a;
29382945
}
29392946
}
2947+
Py_XDECREF(it);
29402948
PyErr_SetString(PyExc_ValueError,
29412949
"bad typecode (must be b, B, u, w, h, H, i, I, l, L, q, Q, f or d)");
29422950
return NULL;

0 commit comments

Comments
 (0)