Patch 8.2.1381
Problem: MS-Windows: crash with Python 3.5 when stdin is redirected.
Solution: Reconnect stdin. (Yasuhiro Matsumoto, Ken Takata, closes #6641)
Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/if_python3.c
*** ../vim-8.2.1380/src/Make_cyg_ming.mak 2020-07-22 19:10:59.877072059
+0200
--- src/Make_cyg_ming.mak 2020-08-06 21:41:31.157707858 +0200
***************
*** 588,593 ****
--- 588,595 ----
CFLAGS += -DFEAT_PYTHON3
ifeq (yes, $(DYNAMIC_PYTHON3))
CFLAGS += -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
+ else
+ CFLAGS += -DPYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
endif
endif
*** ../vim-8.2.1380/src/Make_mvc.mak 2020-07-22 19:10:59.877072059 +0200
--- src/Make_mvc.mak 2020-08-06 21:41:31.157707858 +0200
***************
*** 1026,1031 ****
--- 1026,1034 ----
! ifndef PYTHON3_VER
PYTHON3_VER = 36
! endif
+ ! ifndef DYNAMIC_PYTHON3_DLL
+ DYNAMIC_PYTHON3_DLL = python$(PYTHON3_VER).dll
+ ! endif
! message Python3 requested (version $(PYTHON3_VER)) - root dir is
"$(PYTHON3)"
! if "$(DYNAMIC_PYTHON3)" == "yes"
! message Python3 DLL will be loaded dynamically
***************
*** 1035,1043 ****
PYTHON3_INC = /I "$(PYTHON3)\Include" /I "$(PYTHON3)\PC"
! if "$(DYNAMIC_PYTHON3)" == "yes"
CFLAGS = $(CFLAGS) -DDYNAMIC_PYTHON3 \
! -DDYNAMIC_PYTHON3_DLL=\"python$(PYTHON3_VER).dll\"
PYTHON3_LIB = /nodefaultlib:python$(PYTHON3_VER).lib
! else
PYTHON3_LIB = $(PYTHON3)\libs\python$(PYTHON3_VER).lib
! endif
!endif
--- 1038,1047 ----
PYTHON3_INC = /I "$(PYTHON3)\Include" /I "$(PYTHON3)\PC"
! if "$(DYNAMIC_PYTHON3)" == "yes"
CFLAGS = $(CFLAGS) -DDYNAMIC_PYTHON3 \
! -DDYNAMIC_PYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
PYTHON3_LIB = /nodefaultlib:python$(PYTHON3_VER).lib
! else
+ CFLAGS = $(CFLAGS) -DPYTHON3_DLL=\"$(DYNAMIC_PYTHON3_DLL)\"
PYTHON3_LIB = $(PYTHON3)\libs\python$(PYTHON3_VER).lib
! endif
!endif
*** ../vim-8.2.1380/src/if_python3.c 2020-07-16 22:15:48.944513013 +0200
--- src/if_python3.c 2020-08-06 21:41:31.157707858 +0200
***************
*** 907,912 ****
--- 907,953 ----
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
Python3_Init(void)
{
***************
*** 939,944 ****
--- 980,986 ----
PyImport_AppendInittab("vim", Py3Init_vim);
+ reset_stdin();
Py_Initialize();
// Initialise threads, and below save the state using
*** ../vim-8.2.1380/src/version.c 2020-08-06 21:26:54.436005498 +0200
--- src/version.c 2020-08-06 21:43:48.425328087 +0200
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 1381,
/**/
--
hundred-and-one symptoms of being an internet addict:
136. You decide to stay in a low-paying job teaching just for the
free Internet access.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/202008061947.076JllJW3663282%40masaka.moolenaar.net.