classification
Title: readline.replace_history_item still leaks memory
Type: resource usage Stage: patch review
Components: Extension Modules, Library (Lib) Versions: Python 3.4, Python 3.3, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: haypo, stefanholek
Priority: normal Keywords:

Created on 2011-05-26 12:20 by stefanholek, last changed 2013-10-12 20:38 by pitrou.

Messages (2)
msg136951 - (view) Author: Stefan Holek (stefanholek) Date: 2011-05-26 12:20
This is a continuation of issue #9450.

The 'data' element of a history entry may point to an undo list for the entry. When freeing the entry the associated undo list must be freed as well, and 'free(data)' alone does not cut it. I have not found any other use of the 'data' element in all of GNU Readline, so it is safe to assume it is either NULL or an undo list.

diff --git a/rl/readline.c b/rl/readline.c
index 26ac1e2..c8efd5b 100644
--- a/rl/readline.c
+++ b/rl/readline.c
@@ -541,8 +541,18 @@
 static void
 _py_free_history_entry(HIST_ENTRY *entry)
 {
-       histdata_t data = free_history_entry(entry);
-       free(data);
+       UNDO_LIST *undo_list;
+       UNDO_LIST *release;
+
+       /* A history entry may have an undo_list attached */
+       undo_list = (UNDO_LIST *)free_history_entry(entry);
+       while (undo_list) {
+               release = undo_list;
+               undo_list = undo_list->next;
+               if (release->what == UNDO_DELETE)
+                       free(release->text);
+               free(release);
+       }
 }
msg137506 - (view) Author: Stefan Holek (stefanholek) Date: 2011-06-03 06:37
These undo lists come into existence when history entries are edited interactively (Arrow-Up, edit line, Arrow-Up, edit line, Enter -> undo list of first history entry leaks).
History
Date User Action Args
2013-10-12 20:38:51pitrousetnosy: + haypo
stage: patch review

versions: - Python 2.6, Python 3.1, Python 3.2
2011-06-03 06:37:18stefanholeksetmessages: + msg137506
components: + Extension Modules
versions: + Python 2.6, Python 3.1, Python 2.7, Python 3.2, Python 3.3, Python 3.4
2011-05-26 12:20:01stefanholekcreate