mirror of
https://github.com/python/cpython.git
synced 2026-05-08 19:41:06 +00:00
[3.14] gh-148484: Fix memory leak of iterator in array.array constructor (GH-148523) (GH-148678)
(cherry picked from commit afde75664e)
Co-authored-by: Gleb Popov <gvpopov.dev@gmail.com>
This commit is contained in:
parent
5e758ff525
commit
0f656e2641
1 changed files with 9 additions and 1 deletions
|
|
@ -2854,8 +2854,10 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
len = 0;
|
||||
|
||||
a = newarrayobject(type, len, descr);
|
||||
if (a == NULL)
|
||||
if (a == NULL) {
|
||||
Py_XDECREF(it);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (len > 0 && !array_Check(initial, state)) {
|
||||
Py_ssize_t i;
|
||||
|
|
@ -2864,11 +2866,13 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
PySequence_GetItem(initial, i);
|
||||
if (v == NULL) {
|
||||
Py_DECREF(a);
|
||||
Py_XDECREF(it);
|
||||
return NULL;
|
||||
}
|
||||
if (setarrayitem(a, i, v) != 0) {
|
||||
Py_DECREF(v);
|
||||
Py_DECREF(a);
|
||||
Py_XDECREF(it);
|
||||
return NULL;
|
||||
}
|
||||
Py_DECREF(v);
|
||||
|
|
@ -2880,6 +2884,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
v = array_array_frombytes((PyObject *)a, initial);
|
||||
if (v == NULL) {
|
||||
Py_DECREF(a);
|
||||
Py_XDECREF(it);
|
||||
return NULL;
|
||||
}
|
||||
Py_DECREF(v);
|
||||
|
|
@ -2890,6 +2895,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n);
|
||||
if (ustr == NULL) {
|
||||
Py_DECREF(a);
|
||||
Py_XDECREF(it);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -2910,6 +2916,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
Py_UCS4 *ustr = PyUnicode_AsUCS4Copy(initial);
|
||||
if (ustr == NULL) {
|
||||
Py_DECREF(a);
|
||||
Py_XDECREF(it);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -2937,6 +2944,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return a;
|
||||
}
|
||||
}
|
||||
Py_XDECREF(it);
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"bad typecode (must be b, B, u, w, h, H, i, I, l, L, q, Q, f or d)");
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue