[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