]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-145376: Fix various refleaks in Objects/ (#145609)
authorPieter Eendebak <pieter.eendebak@gmail.com>
Mon, 9 Mar 2026 13:17:27 +0000 (14:17 +0100)
committerGitHub <noreply@github.com>
Mon, 9 Mar 2026 13:17:27 +0000 (14:17 +0100)
Modules/_cursesmodule.c
Modules/binascii.c
Objects/genericaliasobject.c
Objects/object.c
Objects/structseq.c
Objects/typevarobject.c
Objects/unicodeobject.c

index 61464348d6fab8ee675b75543846166d3b03cc92..dd96f9aa62b85b76674926cd14ba8de9c95e15ac 100644 (file)
@@ -1112,11 +1112,13 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
         attr_old = getattrs(self->win);
         if (curses_wattrset(self, attr, "addstr") < 0) {
             curses_release_wstr(strtype, wstr);
+            Py_XDECREF(bytesobj);
             return NULL;
         }
     }
 #ifdef HAVE_NCURSESW
     if (strtype == 2) {
+        assert(bytesobj == NULL);
         if (use_xy) {
             rtn = mvwaddwstr(self->win,y,x,wstr);
             funcname = "mvwaddwstr";
@@ -1130,6 +1132,7 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
     else
 #endif
     {
+        assert(wstr == NULL);
         const char *str = PyBytes_AS_STRING(bytesobj);
         if (use_xy) {
             rtn = mvwaddstr(self->win,y,x,str);
@@ -1210,6 +1213,7 @@ _curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1,
         attr_old = getattrs(self->win);
         if (curses_wattrset(self, attr, "addnstr") < 0) {
             curses_release_wstr(strtype, wstr);
+            Py_XDECREF(bytesobj);
             return NULL;
         }
     }
@@ -2212,6 +2216,7 @@ _curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1,
         attr_old = getattrs(self->win);
         if (curses_wattrset(self, attr, "insstr") < 0) {
             curses_release_wstr(strtype, wstr);
+            Py_XDECREF(bytesobj);
             return NULL;
         }
     }
index e6cd64338064b36f91a54a7254759de3cd8172b5..3f3695d50f2754b23f92f410db08203fe91bd192 100644 (file)
@@ -924,7 +924,7 @@ binascii_a2b_ascii85_impl(PyObject *module, Py_buffer *data, int foldspaces,
     }
     unsigned char *bin_data = PyBytesWriter_GetData(writer);
     if (bin_data == NULL) {
-        return NULL;
+        goto error;
     }
 
     uint32_t leftchar = 0;
index 119dd4b5c2dd00a4593de329776ae5305b3d0120..7aef56cf4e93b8f8ee2266e586d3de982761351b 100644 (file)
@@ -299,6 +299,8 @@ subs_tvars(PyObject *obj, PyObject *params,
                                     &PyTuple_GET_ITEM(arg, 0),
                                     PyTuple_GET_SIZE(arg));
                     if (j < 0) {
+                        Py_DECREF(subparams);
+                        Py_DECREF(subargs);
                         return NULL;
                     }
                     continue;
@@ -455,6 +457,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje
     if (is_args_list) {
         args = tuple_args = PySequence_Tuple(args);
         if (args == NULL) {
+            Py_DECREF(item);
             return NULL;
         }
     }
index b537c0d104e58c1e31fe6215b832f0b9b8044217..e405963614689ff0ad4137038e15bbb57ba6e86a 100644 (file)
@@ -1295,6 +1295,7 @@ _PyObject_SetAttributeErrorContext(PyObject* v, PyObject* name)
     // Augment the exception with the name and object
     if (PyObject_SetAttr(exc, &_Py_ID(name), name) ||
         PyObject_SetAttr(exc, &_Py_ID(obj), v)) {
+        Py_DECREF(exc);
         return 1;
     }
 restore:
@@ -3077,9 +3078,9 @@ Py_ReprEnter(PyObject *obj)
         list = PyList_New(0);
         if (list == NULL)
             return -1;
-        if (PyDict_SetItem(dict, &_Py_ID(Py_Repr), list) < 0)
+        if (_PyDict_SetItem_Take2((PyDictObject *)dict, &_Py_ID(Py_Repr), list) < 0) {
             return -1;
-        Py_DECREF(list);
+        }
     }
     i = PyList_GET_SIZE(list);
     while (--i >= 0) {
index 7a159338b9ba8a56f560c4966409f17ee78c1ff7..b8bb041f0cff218123a33c9572c8dc23c4109022 100644 (file)
@@ -515,7 +515,8 @@ initialize_structseq_dict(PyStructSequence_Desc *desc, PyObject* dict,
     }
 
     if (_PyTuple_Resize(&keys, k) == -1) {
-        goto error;
+        assert(keys == NULL);
+        return -1;
     }
 
     if (PyDict_SetItemString(dict, match_args_key, keys) < 0) {
index 2ec546aff52c0a2c95df435724c953f16f7c7fe3..0a260f4c10278c206db04a991f3fc77616edbce0 100644 (file)
@@ -2305,13 +2305,12 @@ generic_class_getitem(PyObject *cls, PyObject *args, PyObject *kwargs)
 PyObject *
 _Py_subscript_generic(PyThreadState* unused, PyObject *params)
 {
-    params = unpack_typevartuples(params);
-
     PyInterpreterState *interp = _PyInterpreterState_GET();
     if (interp->cached_objects.generic_type == NULL) {
         PyErr_SetString(PyExc_SystemError, "Cannot find Generic type");
         return NULL;
     }
+    params = unpack_typevartuples(params);
     PyObject *args[2] = {(PyObject *)interp->cached_objects.generic_type, params};
     PyObject *result = call_typing_func_object("_GenericAlias", args, 2);
     Py_DECREF(params);
index 7aa85a942e449e322230ff59dde47e03a16f0155..7756f1a84824777752c74edbfeac4c13024c2056 100644 (file)
@@ -5220,7 +5220,7 @@ unicode_decode_utf8_impl(_PyUnicodeWriter *writer,
             }
 
             if (_PyUnicodeWriter_Prepare(writer, end - s, 127) < 0) {
-                return -1;
+                goto onError;
             }
         }
     }