]> granicus.if.org Git - vim/commitdiff
patch 8.2.1830: MS-Windows: Python3 issue with stdin v8.2.1830
authorBram Moolenaar <Bram@vim.org>
Sat, 10 Oct 2020 21:26:28 +0000 (23:26 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 10 Oct 2020 21:26:28 +0000 (23:26 +0200)
Problem:    MS-Windows: Python3 issue with stdin.
Solution:   Check if stdin is readable. (Ken Takata, closes #7106)

src/if_python3.c
src/version.c

index f6904c38014ba66bb18106f4dd592b4d62803fc6..e148e53bb7a06c920b0c6a83f917e8d0dd11e15a 100644 (file)
@@ -908,8 +908,27 @@ python3_loaded(void)
 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 NUL.
+/*
+ * Return TRUE if stdin is readable from Python 3.
+ */
+    static BOOL
+is_stdin_readable(void)
+{
+    DWORD          mode, eventnum;
+    struct _stat    st;
+    int                    fd = fileno(stdin);
+    HANDLE         hstdin = (HANDLE)_get_osfhandle(fd);
+
+    // Check if stdin is connected to the console.
+    if (GetConsoleMode(hstdin, &mode))
+       // Check if it is opened as input.
+       return GetNumberOfConsoleInputEvents(hstdin, &eventnum);
+
+    return _fstat(fd, &st) == 0;
+}
+
+// Python 3.5 or later will abort inside Py_Initialize() when stdin has
+// been closed (i.e. executed by "vim -").  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
@@ -917,7 +936,6 @@ reset_stdin(void)
 {
     FILE *(*py__acrt_iob_func)(unsigned) = NULL;
     FILE *(*pyfreopen)(const char *, const char *, FILE *) = NULL;
-    char *stdin_name = "NUL";
     HINSTANCE hinst;
 
 # ifdef DYNAMIC_PYTHON3
@@ -925,7 +943,7 @@ reset_stdin(void)
 # else
     hinst = GetModuleHandle(PYTHON3_DLL);
 # endif
-    if (hinst == NULL)
+    if (hinst == NULL || is_stdin_readable())
        return;
 
     // Get "freopen" and "stdin" which are used in the python DLL.
@@ -938,14 +956,12 @@ reset_stdin(void)
        if (hpystdiodll)
            pyfreopen = (void *)GetProcAddress(hpystdiodll, "freopen");
     }
-    if (isatty(fileno(stdin)))
-       stdin_name = "CONIN$";
 
-    // Reconnect stdin to NUL or CONIN$.
+    // Reconnect stdin to CONIN$.
     if (pyfreopen != NULL)
-       pyfreopen(stdin_name, "r", py__acrt_iob_func(0));
+       pyfreopen("CONIN$", "r", py__acrt_iob_func(0));
     else
-       freopen(stdin_name, "r", stdin);
+       freopen("CONIN$", "r", stdin);
 }
 #else
 # define reset_stdin()
index 388932fd5fdd63077598f7396b72be169a1a8ab0..2577c142c3dd71bb3aea3c4bef2ea29ac2eb5b37 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1830,
 /**/
     1829,
 /**/