[Python-checkins] r83669 - in python/branches/release27-maint: Misc/NEWS Modules/readline.c
mark.dickinson
python-checkins at python.org
Tue Aug 3 18:18:39 CEST 2010
Author: mark.dickinson
Date: Tue Aug 3 18:18:39 2010
New Revision: 83669
Log:
Merged revisions 83667 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r83667 | mark.dickinson | 2010-08-03 17:08:16 +0100 (Tue, 03 Aug 2010) | 2 lines
Issue #9450: Fix memory leaks in readline.remove/replace_history_entry.
........
Modified:
python/branches/release27-maint/ (props changed)
python/branches/release27-maint/Misc/NEWS
python/branches/release27-maint/Modules/readline.c
Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS (original)
+++ python/branches/release27-maint/Misc/NEWS Tue Aug 3 18:18:39 2010
@@ -133,6 +133,9 @@
Extension Modules
-----------------
+- Issue #9450: Fix memory leak in readline.replace_history_item and
+ readline.remove_history_item for readline version >= 5.0.
+
- Issue #8105: Validate file descriptor passed to mmap.mmap on Windows.
- Issue #1019882: Fix IndexError when loading certain hotshot stats.
Modified: python/branches/release27-maint/Modules/readline.c
==============================================================================
--- python/branches/release27-maint/Modules/readline.c (original)
+++ python/branches/release27-maint/Modules/readline.c Tue Aug 3 18:18:39 2010
@@ -356,6 +356,38 @@
"set_completer_delims(string) -> None\n\
set the readline word delimiters for tab-completion");
+/* _py_free_history_entry: Utility function to free a history entry. */
+
+#if defined(RL_READLINE_VERSION) && RL_READLINE_VERSION >= 0x0500
+
+/* Readline version >= 5.0 introduced a timestamp field into the history entry
+ structure; this needs to be freed to avoid a memory leak. This version of
+ readline also introduced the handy 'free_history_entry' function, which
+ takes care of the timestamp. */
+
+static void
+_py_free_history_entry(HIST_ENTRY *entry)
+{
+ histdata_t data = free_history_entry(entry);
+ free(data);
+}
+
+#else
+
+/* No free_history_entry function; free everything manually. */
+
+static void
+_py_free_history_entry(HIST_ENTRY *entry)
+{
+ if (entry->line)
+ free((void *)entry->line);
+ if (entry->data)
+ free(entry->data);
+ free(entry);
+}
+
+#endif
+
static PyObject *
py_remove_history(PyObject *self, PyObject *args)
{
@@ -377,12 +409,7 @@
return NULL;
}
/* free memory allocated for the history entry */
- if (entry->line)
- free((void *)entry->line);
- if (entry->data)
- free(entry->data);
- free(entry);
-
+ _py_free_history_entry(entry);
Py_RETURN_NONE;
}
@@ -414,12 +441,7 @@
return NULL;
}
/* free memory allocated for the old history entry */
- if (old_entry->line)
- free((void *)old_entry->line);
- if (old_entry->data)
- free(old_entry->data);
- free(old_entry);
-
+ _py_free_history_entry(old_entry);
Py_RETURN_NONE;
}
More information about the Python-checkins
mailing list