[Python-checkins] cpython (merge 3.2 -> default): Merge

antoine.pitrou python-checkins at python.org
Thu Mar 17 23:37:23 CET 2011


http://hg.python.org/cpython/rev/b4104ffd5127
changeset:   68664:b4104ffd5127
parent:      68661:90cdc371a3b8
parent:      68663:0b2aab561a15
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Thu Mar 17 23:37:06 2011 +0100
summary:
  Merge

files:
  Misc/NEWS

diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #10914: fix bogus memory management in Modules/getpath.c, leading to
+  a possible crash when calling Py_SetPath().
+
 - _ast.__version__ is now a Mercurial integer and hex revision.
 
 - Issue #11432: A bug was introduced in subprocess.Popen on posix systems with
diff --git a/Modules/getpath.c b/Modules/getpath.c
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -134,6 +134,7 @@
 static wchar_t exec_prefix[MAXPATHLEN+1];
 static wchar_t progpath[MAXPATHLEN+1];
 static wchar_t *module_search_path = NULL;
+static int module_search_path_malloced = 0;
 static wchar_t *lib_python = L"lib/python" VERSION;
 
 static void
@@ -634,7 +635,6 @@
     bufsz += wcslen(zip_path) + 1;
     bufsz += wcslen(exec_prefix) + 1;
 
-    /* This is the only malloc call in this file */
     buf = (wchar_t *)PyMem_Malloc(bufsz*sizeof(wchar_t));
 
     if (buf == NULL) {
@@ -687,6 +687,7 @@
 
         /* And publish the results */
         module_search_path = buf;
+        module_search_path_malloced = 1;
     }
 
     /* Reduce prefix and exec_prefix to their essence,
@@ -726,15 +727,18 @@
 Py_SetPath(const wchar_t *path)
 {
     if (module_search_path != NULL) {
-        free(module_search_path);
+        if (module_search_path_malloced)
+            PyMem_Free(module_search_path);
         module_search_path = NULL;
+        module_search_path_malloced = 0;
     }
     if (path != NULL) {
         extern wchar_t *Py_GetProgramName(void);
         wchar_t *prog = Py_GetProgramName();
         wcsncpy(progpath, prog, MAXPATHLEN);
         exec_prefix[0] = prefix[0] = L'\0';
-        module_search_path = malloc((wcslen(path) + 1) * sizeof(wchar_t));
+        module_search_path = PyMem_Malloc((wcslen(path) + 1) * sizeof(wchar_t));
+        module_search_path_malloced = 1;
         if (module_search_path != NULL)
             wcscpy(module_search_path, path);
     }

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list