[Python-checkins] cpython (3.3): Issue #17289: The readline module now plays nicer with external modules or
antoine.pitrou
python-checkins at python.org
Mon May 6 21:54:16 CEST 2013
http://hg.python.org/cpython/rev/df0afd3ebb70
changeset: 83655:df0afd3ebb70
branch: 3.3
parent: 83652:f6c50b437de6
user: Antoine Pitrou <solipsis at pitrou.net>
date: Mon May 06 21:51:03 2013 +0200
summary:
Issue #17289: The readline module now plays nicer with external modules or applications changing the rl_completer_word_break_characters global variable.
Initial patch by Bradley Froehle.
files:
Misc/NEWS | 4 ++++
Modules/readline.c | 25 ++++++++++++++++++-------
2 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -47,6 +47,10 @@
Library
-------
+- Issue #17289: The readline module now plays nicer with external modules
+ or applications changing the rl_completer_word_break_characters global
+ variable. Initial patch by Bradley Froehle.
+
- Issue #12181: select module: Fix struct kevent definition on OpenBSD 64-bit
platforms. Patch by Federico Schwindt.
diff --git a/Modules/readline.c b/Modules/readline.c
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -70,6 +70,10 @@
int num_matches, int max_length);
#endif
+/* Memory allocated for rl_completer_word_break_characters
+ (see issue #17289 for the motivation). */
+static char *completer_word_break_characters;
+
/* Exported function to send one line to readline's init file parser */
static PyObject *
@@ -368,12 +372,20 @@
{
char *break_chars;
- if(!PyArg_ParseTuple(args, "s:set_completer_delims", &break_chars)) {
+ if (!PyArg_ParseTuple(args, "s:set_completer_delims", &break_chars)) {
return NULL;
}
- free((void*)rl_completer_word_break_characters);
- rl_completer_word_break_characters = strdup(break_chars);
- Py_RETURN_NONE;
+ /* Keep a reference to the allocated memory in the module state in case
+ some other module modifies rl_completer_word_break_characters
+ (see issue #17289). */
+ free(completer_word_break_characters);
+ completer_word_break_characters = strdup(break_chars);
+ if (completer_word_break_characters) {
+ rl_completer_word_break_characters = completer_word_break_characters;
+ Py_RETURN_NONE;
+ }
+ else
+ return PyErr_NoMemory();
}
PyDoc_STRVAR(doc_set_completer_delims,
@@ -918,7 +930,8 @@
/* Set our completion function */
rl_attempted_completion_function = (CPPFunction *)flex_complete;
/* Set Python word break characters */
- rl_completer_word_break_characters =
+ completer_word_break_characters =
+ rl_completer_word_break_characters =
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
/* All nonalphanums except '.' */
@@ -1174,8 +1187,6 @@
if (m == NULL)
return NULL;
-
-
PyOS_ReadlineFunctionPointer = call_readline;
setup_readline();
return m;
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list