mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.1381: MS-Windows: crash with Python 3.5 when stdin is redirected
Problem: MS-Windows: crash with Python 3.5 when stdin is redirected. Solution: Reconnect stdin. (Yasuhiro Matsumoto, Ken Takata, closes #6641)
This commit is contained in:
@@ -588,6 +588,8 @@ ifdef PYTHON3
|
|||||||
CFLAGS += -DFEAT_PYTHON3
|
CFLAGS += -DFEAT_PYTHON3
|
||||||
ifeq (yes, $(DYNAMIC_PYTHON3))
|
ifeq (yes, $(DYNAMIC_PYTHON3))
|
||||||
CFLAGS += -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
|
CFLAGS += -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
|
||||||
|
else
|
||||||
|
CFLAGS += -DPYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@@ -1026,6 +1026,9 @@ PYTHON_LIB = $(PYTHON)\libs\python$(PYTHON_VER).lib
|
|||||||
! ifndef PYTHON3_VER
|
! ifndef PYTHON3_VER
|
||||||
PYTHON3_VER = 36
|
PYTHON3_VER = 36
|
||||||
! endif
|
! endif
|
||||||
|
! ifndef DYNAMIC_PYTHON3_DLL
|
||||||
|
DYNAMIC_PYTHON3_DLL = python$(PYTHON3_VER).dll
|
||||||
|
! endif
|
||||||
! message Python3 requested (version $(PYTHON3_VER)) - root dir is "$(PYTHON3)"
|
! message Python3 requested (version $(PYTHON3_VER)) - root dir is "$(PYTHON3)"
|
||||||
! if "$(DYNAMIC_PYTHON3)" == "yes"
|
! if "$(DYNAMIC_PYTHON3)" == "yes"
|
||||||
! message Python3 DLL will be loaded dynamically
|
! message Python3 DLL will be loaded dynamically
|
||||||
@@ -1035,9 +1038,10 @@ PYTHON3_OBJ = $(OUTDIR)\if_python3.obj
|
|||||||
PYTHON3_INC = /I "$(PYTHON3)\Include" /I "$(PYTHON3)\PC"
|
PYTHON3_INC = /I "$(PYTHON3)\Include" /I "$(PYTHON3)\PC"
|
||||||
! if "$(DYNAMIC_PYTHON3)" == "yes"
|
! if "$(DYNAMIC_PYTHON3)" == "yes"
|
||||||
CFLAGS = $(CFLAGS) -DDYNAMIC_PYTHON3 \
|
CFLAGS = $(CFLAGS) -DDYNAMIC_PYTHON3 \
|
||||||
-DDYNAMIC_PYTHON3_DLL=\"python$(PYTHON3_VER).dll\"
|
-DDYNAMIC_PYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
|
||||||
PYTHON3_LIB = /nodefaultlib:python$(PYTHON3_VER).lib
|
PYTHON3_LIB = /nodefaultlib:python$(PYTHON3_VER).lib
|
||||||
! else
|
! else
|
||||||
|
CFLAGS = $(CFLAGS) -DPYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
|
||||||
PYTHON3_LIB = $(PYTHON3)\libs\python$(PYTHON3_VER).lib
|
PYTHON3_LIB = $(PYTHON3)\libs\python$(PYTHON3_VER).lib
|
||||||
! endif
|
! endif
|
||||||
!endif
|
!endif
|
||||||
|
@@ -907,6 +907,47 @@ python3_loaded(void)
|
|||||||
|
|
||||||
static wchar_t *py_home_buf = NULL;
|
static wchar_t *py_home_buf = NULL;
|
||||||
|
|
||||||
|
#if defined(MSWIN) && (PY_VERSION_HEX >= 0x030500f0)
|
||||||
|
// Python 3.5 or later will abort inside Py_Initialize() when stdin is
|
||||||
|
// redirected. Reconnect stdin to CONIN$.
|
||||||
|
// Note that the python DLL is linked to its own stdio DLL which can be
|
||||||
|
// differ from Vim's stdio.
|
||||||
|
static void
|
||||||
|
reset_stdin(void)
|
||||||
|
{
|
||||||
|
FILE *(*py__acrt_iob_func)(unsigned) = NULL;
|
||||||
|
FILE *(*pyfreopen)(const char *, const char *, FILE *) = NULL;
|
||||||
|
HINSTANCE hinst;
|
||||||
|
|
||||||
|
# ifdef DYNAMIC_PYTHON3
|
||||||
|
hinst = hinstPy3;
|
||||||
|
# else
|
||||||
|
hinst = GetModuleHandle(PYTHON3_DLL);
|
||||||
|
# endif
|
||||||
|
if (hinst == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get "freopen" and "stdin" which are used in the python DLL.
|
||||||
|
// "stdin" is defined as "__acrt_iob_func(0)" in VC++ 2015 or later.
|
||||||
|
py__acrt_iob_func = get_dll_import_func(hinst, "__acrt_iob_func");
|
||||||
|
if (py__acrt_iob_func)
|
||||||
|
{
|
||||||
|
HINSTANCE hpystdiodll = find_imported_module_by_funcname(hinst,
|
||||||
|
"__acrt_iob_func");
|
||||||
|
if (hpystdiodll)
|
||||||
|
pyfreopen = (void*)GetProcAddress(hpystdiodll, "freopen");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reconnect stdin to CONIN$.
|
||||||
|
if (pyfreopen)
|
||||||
|
pyfreopen("CONIN$", "r", py__acrt_iob_func(0));
|
||||||
|
else
|
||||||
|
freopen("CONIN$", "r", stdin);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define reset_stdin()
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
Python3_Init(void)
|
Python3_Init(void)
|
||||||
{
|
{
|
||||||
@@ -939,6 +980,7 @@ Python3_Init(void)
|
|||||||
|
|
||||||
PyImport_AppendInittab("vim", Py3Init_vim);
|
PyImport_AppendInittab("vim", Py3Init_vim);
|
||||||
|
|
||||||
|
reset_stdin();
|
||||||
Py_Initialize();
|
Py_Initialize();
|
||||||
|
|
||||||
// Initialise threads, and below save the state using
|
// Initialise threads, and below save the state using
|
||||||
|
@@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1381,
|
||||||
/**/
|
/**/
|
||||||
1380,
|
1380,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user