]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-140398: fix memory leaks in `readline` module when `PySys_Audit` fails (#140400)
authorShamil <ashm.tech@proton.me>
Tue, 21 Oct 2025 07:54:34 +0000 (10:54 +0300)
committerGitHub <noreply@github.com>
Tue, 21 Oct 2025 07:54:34 +0000 (13:24 +0530)
Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst [new file with mode: 0644]
Modules/readline.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-21-09-20-03.gh-issue-140398.SoABwJ.rst
new file mode 100644 (file)
index 0000000..481dac7
--- /dev/null
@@ -0,0 +1,4 @@
+Fix memory leaks in :mod:`readline` functions
+:func:`~readline.read_init_file`, :func:`~readline.read_history_file`,
+:func:`~readline.write_history_file`, and
+:func:`~readline.append_history_file` when :c:func:`PySys_Audit` fails.
index 630a68799909497d757f4a2ccff7fd43827a42c6..e89755b0cb4b2af8da233bf457bf64b33fc8de3e 100644 (file)
@@ -255,6 +255,7 @@ readline_read_init_file_impl(PyObject *module, PyObject *filename_obj)
         if (!PyUnicode_FSConverter(filename_obj, &filename_bytes))
             return NULL;
         if (PySys_Audit("open", "OCi", filename_obj, 'r', 0) < 0) {
+            Py_DECREF(filename_bytes);
             return NULL;
         }
         errno = rl_read_init_file(PyBytes_AS_STRING(filename_bytes));
@@ -298,6 +299,7 @@ readline_read_history_file_impl(PyObject *module, PyObject *filename_obj)
         if (!PyUnicode_FSConverter(filename_obj, &filename_bytes))
             return NULL;
         if (PySys_Audit("open", "OCi", filename_obj, 'r', 0) < 0) {
+            Py_DECREF(filename_bytes);
             return NULL;
         }
         errno = read_history(PyBytes_AS_STRING(filename_bytes));
@@ -343,6 +345,7 @@ readline_write_history_file_impl(PyObject *module, PyObject *filename_obj)
             return NULL;
         filename = PyBytes_AS_STRING(filename_bytes);
         if (PySys_Audit("open", "OCi", filename_obj, 'w', 0) < 0) {
+            Py_DECREF(filename_bytes);
             return NULL;
         }
     } else {
@@ -400,6 +403,7 @@ readline_append_history_file_impl(PyObject *module, int nelements,
             return NULL;
         filename = PyBytes_AS_STRING(filename_bytes);
         if (PySys_Audit("open", "OCi", filename_obj, 'a', 0) < 0) {
+            Py_DECREF(filename_bytes);
             return NULL;
         }
     } else {