https://github.com/python/cpython/commit/886bc6e14bf01b615ffa328cd1acb46f9513a7fe
commit: 886bc6e14bf01b615ffa328cd1acb46f9513a7fe
branch: main
author: Pieter Eendebak <[email protected]>
committer: vstinner <[email protected]>
date: 2026-03-09T14:19:36+01:00
summary:
gh-145376: Fix various reference leaks in Objects/ and Modules/ (#145385)
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
files:
M Modules/itertoolsmodule.c
M Objects/enumobject.c
M Objects/listobject.c
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index ff0e2fd2b3569d..bc25bf6bfc1bd2 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -3531,23 +3531,26 @@ count_traverse(PyObject *op, visitproc visit, void *arg)
static PyObject *
count_nextlong(countobject *lz)
{
- PyObject *long_cnt;
- PyObject *stepped_up;
-
- long_cnt = lz->long_cnt;
- if (long_cnt == NULL) {
+ if (lz->long_cnt == NULL) {
/* Switch to slow_mode */
- long_cnt = PyLong_FromSsize_t(PY_SSIZE_T_MAX);
- if (long_cnt == NULL)
+ lz->long_cnt = PyLong_FromSsize_t(PY_SSIZE_T_MAX);
+ if (lz->long_cnt == NULL) {
return NULL;
+ }
}
- assert(lz->cnt == PY_SSIZE_T_MAX && long_cnt != NULL);
+ assert(lz->cnt == PY_SSIZE_T_MAX && lz->long_cnt != NULL);
+
+ // We hold one reference to "result" (a.k.a. the old value of
+ // lz->long_cnt); we'll either return it or keep it in lz->long_cnt.
+ PyObject *result = lz->long_cnt;
- stepped_up = PyNumber_Add(long_cnt, lz->long_step);
- if (stepped_up == NULL)
+ PyObject *stepped_up = PyNumber_Add(result, lz->long_step);
+ if (stepped_up == NULL) {
return NULL;
+ }
lz->long_cnt = stepped_up;
- return long_cnt;
+
+ return result;
}
static PyObject *
diff --git a/Objects/enumobject.c b/Objects/enumobject.c
index 814ce4f919514b..70e7cce6aba008 100644
--- a/Objects/enumobject.c
+++ b/Objects/enumobject.c
@@ -178,14 +178,16 @@ enum_traverse(PyObject *op, visitproc visit, void *arg)
static inline PyObject *
increment_longindex_lock_held(enumobject *en)
{
- PyObject *next_index = en->en_longindex;
- if (next_index == NULL) {
- next_index = PyLong_FromSsize_t(PY_SSIZE_T_MAX);
- if (next_index == NULL) {
+ if (en->en_longindex == NULL) {
+ en->en_longindex = PyLong_FromSsize_t(PY_SSIZE_T_MAX);
+ if (en->en_longindex == NULL) {
return NULL;
}
}
- assert(next_index != NULL);
+ assert(en->en_longindex != NULL);
+ // We hold one reference to "next_index" (a.k.a. the old value of
+ // en->en_longindex); we'll either return it or keep it in en->en_longindex
+ PyObject *next_index = en->en_longindex;
PyObject *stepped_up = PyNumber_Add(next_index, en->one);
if (stepped_up == NULL) {
return NULL;
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 3921b7cd7b69bc..7fc21907fefd31 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -4294,7 +4294,9 @@ listiter_reduce_general(void *_it, int forward)
}
/* empty iterator, create an empty list */
list = PyList_New(0);
- if (list == NULL)
+ if (list == NULL) {
+ Py_DECREF(iter);
return NULL;
+ }
return Py_BuildValue("N(N)", iter, list);
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]