]> granicus.if.org Git - vim/commitdiff
patch 8.1.0453: MS-Windows: executable() is not reliable v8.1.0453
authorBram Moolenaar <Bram@vim.org>
Sat, 6 Oct 2018 13:18:45 +0000 (15:18 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 6 Oct 2018 13:18:45 +0000 (15:18 +0200)
Problem:    MS-Windows: executable() is not reliable.
Solution:   Use $PATHEXT properly. (Yasuhiro Matsumoto, closes #3412)

src/os_win32.c
src/testdir/test_functions.vim
src/version.c

index 4ba060bb909b7ebcbcb3df95fe3f1b28a8a091b2..9d1d8cbc2202d5b76ba91baceb5e32ca96247335 100644 (file)
@@ -3535,21 +3535,44 @@ mch_can_exe(char_u *name, char_u **path, int use_path)
 {
     char_u     buf[_MAX_PATH];
     int                len = (int)STRLEN(name);
-    char_u     *p;
+    char_u     *p, *saved;
 
     if (len >= _MAX_PATH)      /* safety check */
        return FALSE;
 
-    /* If there already is an extension try using the name directly.  Also do
-     * this with a Unix-shell like 'shell'. */
-    if (vim_strchr(gettail(name), '.') != NULL
-                              || strstr((char *)gettail(p_sh), "sh") != NULL)
+    /* Ty using the name directly when a Unix-shell like 'shell'. */
+    if (strstr((char *)gettail(p_sh), "sh") != NULL)
        if (executable_exists((char *)name, path, use_path))
            return TRUE;
 
     /*
      * Loop over all extensions in $PATHEXT.
      */
+    p = mch_getenv("PATHEXT");
+    if (p == NULL)
+       p = (char_u *)".com;.exe;.bat;.cmd";
+    saved = vim_strsave(p);
+    if (saved == NULL)
+       return FALSE;
+    p = saved;
+    while (*p)
+    {
+       char_u  *tmp = vim_strchr(p, ';');
+
+       if (tmp != NULL)
+           *tmp = NUL;
+       if (_stricoll((char *)name + len - STRLEN(p), (char *)p) == 0
+                           && executable_exists((char *)name, path, use_path))
+       {
+           vim_free(saved);
+           return TRUE;
+       }
+       if (tmp == NULL)
+           break;
+       p = tmp + 1;
+    }
+    vim_free(saved);
+
     vim_strncpy(buf, name, _MAX_PATH - 1);
     p = mch_getenv("PATHEXT");
     if (p == NULL)
index cc82f8191c7f3ea4087f5ef9de8ff0e6cc0253e4..17f7c1905e19104d05e8044536b5c5c6bdfbd159 100644 (file)
@@ -800,6 +800,19 @@ func Test_filewritable()
   bw!
 endfunc
 
+func Test_Executable()
+  if has('win32')
+    call assert_equal(1, executable('notepad'))
+    call assert_equal(1, executable('notepad.exe'))
+    call assert_equal(0, executable('notepad.exe.exe'))
+    call assert_equal(0, executable('shell32.dll'))
+    call assert_equal(0, executable('win.ini'))
+  elseif has('unix')
+    call assert_equal(1, executable('cat'))
+    call assert_equal(0, executable('dog'))
+  endif
+endfunc
+
 func Test_hostname()
   let hostname_vim = hostname()
   if has('unix')
index b50ce81aa5f17b5cb91a2b8b4abbc84aa24ad703..dee74d3e0ab6cc99e472370098f622df013ae00d 100644 (file)
@@ -792,6 +792,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    453,
 /**/
     452,
 /**/