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>
This commit is contained in:
Pieter Eendebak 2026-03-09 14:19:36 +01:00 committed by GitHub
parent 8060aa5d7d
commit 886bc6e14b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 24 additions and 17 deletions

View file

@ -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);
stepped_up = PyNumber_Add(long_cnt, lz->long_step);
if (stepped_up == 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;
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 *

View file

@ -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;

View file

@ -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);
}