Hi,

2016/2/2 Tue 7:11:32 UTC+9 Bram Moolenaar wrote:
> Ken Takata wrote:
> 
> > When 'enc' is utf-8, executable() may fail on very long filename which is
> > longer than _MAX_PATH bytes in UTF-8 and shorter than _MAX_PATH character in
> > UTF-16.
> > Here is an example on Japanese Windows:
> > 
> > C:\tmp>gvim -N -u NONE --cmd "set enc=utf-8" 
> > ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ.bat
> > :w
> > :echo glob('あ*.bat')
> > ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ.bat
> > :echo strlen(glob('あ*.bat'))
> > 604   " longer than 260
> > :echo strchars(glob('あ*.bat'))
> > 204   " shorter than 260
> > :echo executable(glob('あ*.bat'))
> > 0     " 1 is expected.
> > 
> > 
> > Attached patch fixes the problem.
> 
> Thanks!

I have updated the patch for 8.1.0453:

* Fixed conflicts.
* Fixed a typo in a comment which was added in 8.1.0453.

Regards,
Ken Takata

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
# HG changeset patch
# Parent 6ee3a815113c128147fa9831c2004916a7daba86
# Parent  707014f5a78471ca3aa6fc1bb893119da5489633

diff --git a/src/os_win32.c b/src/os_win32.c
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -3547,14 +3547,21 @@ mch_writable(char_u *name)
     int
 mch_can_exe(char_u *name, char_u **path, int use_path)
 {
+#ifdef FEAT_MBYTE
+    /* WinNT and later can use _MAX_PATH wide characters for a pathname, which
+     * means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is
+     * UTF-8. */
+    char_u	buf[_MAX_PATH * 3];
+#else
     char_u	buf[_MAX_PATH];
+#endif
     int		len = (int)STRLEN(name);
     char_u	*p, *saved;
 
-    if (len >= _MAX_PATH)	/* safety check */
+    if (len >= sizeof(buf))	/* safety check */
 	return FALSE;
 
-    /* Ty using the name directly when a Unix-shell like 'shell'. */
+    /* Try 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;
@@ -3587,7 +3594,7 @@ mch_can_exe(char_u *name, char_u **path,
     }
     vim_free(saved);
 
-    vim_strncpy(buf, name, _MAX_PATH - 1);
+    vim_strncpy(buf, name, sizeof(buf) - 1);
     p = mch_getenv("PATHEXT");
     if (p == NULL)
 	p = (char_u *)".com;.exe;.bat;.cmd";
@@ -3602,7 +3609,7 @@ mch_can_exe(char_u *name, char_u **path,
 		++p;
 	}
 	else
-	    copy_option_part(&p, buf + len, _MAX_PATH - len, ";");
+	    copy_option_part(&p, buf + len, sizeof(buf) - len, ";");
 	if (executable_exists((char *)buf, path, use_path))
 	    return TRUE;
     }

Raspunde prin e-mail lui