mirror of https://github.com/python/cpython
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. ........
This commit is contained in:
parent
5ebb3beb9b
commit
4ee9853028
|
@ -133,6 +133,9 @@ Library
|
||||||
Extension Modules
|
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 #8105: Validate file descriptor passed to mmap.mmap on Windows.
|
||||||
|
|
||||||
- Issue #1019882: Fix IndexError when loading certain hotshot stats.
|
- Issue #1019882: Fix IndexError when loading certain hotshot stats.
|
||||||
|
|
|
@ -356,6 +356,38 @@ PyDoc_STRVAR(doc_set_completer_delims,
|
||||||
"set_completer_delims(string) -> None\n\
|
"set_completer_delims(string) -> None\n\
|
||||||
set the readline word delimiters for tab-completion");
|
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 *
|
static PyObject *
|
||||||
py_remove_history(PyObject *self, PyObject *args)
|
py_remove_history(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
@ -377,12 +409,7 @@ py_remove_history(PyObject *self, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* free memory allocated for the history entry */
|
/* free memory allocated for the history entry */
|
||||||
if (entry->line)
|
_py_free_history_entry(entry);
|
||||||
free((void *)entry->line);
|
|
||||||
if (entry->data)
|
|
||||||
free(entry->data);
|
|
||||||
free(entry);
|
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,12 +441,7 @@ py_replace_history(PyObject *self, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* free memory allocated for the old history entry */
|
/* free memory allocated for the old history entry */
|
||||||
if (old_entry->line)
|
_py_free_history_entry(old_entry);
|
||||||
free((void *)old_entry->line);
|
|
||||||
if (old_entry->data)
|
|
||||||
free(old_entry->data);
|
|
||||||
free(old_entry);
|
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue