changeset 6083:7cfbad4a78bf v7.4.380

updated for version 7.4.380 Problem: Loading python may cause Vim to exit. Solution: Avoid loading the "site" module. (Taro Muraoka)
author Bram Moolenaar <bram@vim.org>
date Wed, 23 Jul 2014 16:57:00 +0200
parents 99f3d2a4f60a
children 56e7dff07e18
files src/if_python.c src/version.c
diffstat 2 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -295,6 +295,9 @@ struct PyMethodDef { Py_ssize_t a; };
 #  define PyCObject_FromVoidPtr dll_PyCObject_FromVoidPtr
 #  define PyCObject_AsVoidPtr dll_PyCObject_AsVoidPtr
 # endif
+# if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
+#  define Py_NoSiteFlag (*dll_Py_NoSiteFlag)
+# endif
 
 /*
  * Pointers for dynamic link
@@ -440,6 +443,9 @@ static void* (*dll_PyCapsule_GetPointer)
 static PyObject* (*dll_PyCObject_FromVoidPtr)(void *cobj, void (*destr)(void *));
 static void* (*dll_PyCObject_AsVoidPtr)(PyObject *);
 # endif
+# if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
+static int* dll_Py_NoSiteFlag;
+# endif
 
 static HINSTANCE hinstPython = 0; /* Instance of python.dll */
 
@@ -633,6 +639,9 @@ static struct
     {"PyCObject_FromVoidPtr", (PYTHON_PROC*)&dll_PyCObject_FromVoidPtr},
     {"PyCObject_AsVoidPtr", (PYTHON_PROC*)&dll_PyCObject_AsVoidPtr},
 # endif
+# if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
+    {"Py_NoSiteFlag", (PYTHON_PROC*)&dll_Py_NoSiteFlag},
+# endif
     {"", NULL},
 };
 
@@ -901,6 +910,10 @@ Python_Init(void)
 {
     if (!initialised)
     {
+#if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
+	PyObject *site;
+#endif
+
 #ifdef DYNAMIC_PYTHON
 	if (!python_enabled(TRUE))
 	{
@@ -915,11 +928,29 @@ Python_Init(void)
 
 	init_structs();
 
+#if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
+	/* Disable implicit 'import site', because it may cause Vim to exit
+	 * when it can't be found. */
+	Py_NoSiteFlag++;
+#endif
+
 #if !defined(MACOS) || defined(MACOS_X_UNIX)
 	Py_Initialize();
 #else
 	PyMac_Initialize();
 #endif
+
+#if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
+	/* 'import site' explicitly. */
+	site = PyImport_ImportModule("site");
+	if (site == NULL)
+	{
+	    EMSG(_("E887: Sorry, this command is disabled, the Python's site module could not be loaded."));
+	    goto fail;
+	}
+	Py_DECREF(site);
+#endif
+
 	/* Initialise threads, and below save the state using
 	 * PyEval_SaveThread.  Without the call to PyEval_SaveThread, thread
 	 * specific state (such as the system trace hook), will be lost
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    380,
+/**/
     379,
 /**/
     378,