From b49fe548b206bf50f7bb90eea345fe02e966e9eb Mon Sep 17 00:00:00 2001 From: VanshAgarwal24036 Date: Tue, 20 Jan 2026 19:49:04 +0530 Subject: [PATCH 1/3] gh-144067: Fix memory leak when setupterm is followed by initscr --- Modules/_cursesmodule.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 61464348d6fab8..1f1b83fa453890 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -3731,6 +3731,9 @@ _curses_initscr_impl(PyObject *module) } return PyCursesWindow_New(state, stdscr, NULL, NULL); } + if (cur_term != NULL) { + del_curterm(cur_term); + cur_term = NULL; win = initscr(); From df6de5eea40b4ce15e32c9a9c07529a7ce68b16d Mon Sep 17 00:00:00 2001 From: VanshAgarwal24036 Date: Tue, 20 Jan 2026 20:00:09 +0530 Subject: [PATCH 2/3] gh-144067: Fix memory leak when setupterm is followed by initscr --- Modules/_cursesmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 1f1b83fa453890..cef2ece3832225 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -3734,7 +3734,7 @@ _curses_initscr_impl(PyObject *module) if (cur_term != NULL) { del_curterm(cur_term); cur_term = NULL; - + } win = initscr(); if (win == NULL) { From 0cc8565b001ec8113f26ef66c9619db363b69561 Mon Sep 17 00:00:00 2001 From: VanshAgarwal24036 Date: Tue, 20 Jan 2026 20:14:21 +0530 Subject: [PATCH 3/3] News Added --- .../next/Library/2026-01-20-20-13-35.gh-issue-144067.5YEhzs.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-01-20-20-13-35.gh-issue-144067.5YEhzs.rst diff --git a/Misc/NEWS.d/next/Library/2026-01-20-20-13-35.gh-issue-144067.5YEhzs.rst b/Misc/NEWS.d/next/Library/2026-01-20-20-13-35.gh-issue-144067.5YEhzs.rst new file mode 100644 index 00000000000000..3964f0c7f7b002 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-01-20-20-13-35.gh-issue-144067.5YEhzs.rst @@ -0,0 +1,2 @@ +Fix a memory leak in the curses module when setupterm() is called before +initscr(), where the previously allocated terminal state was not freed.