win,fs.c: Fix is_executable_ext #10209

Fix issue that increment expression is executable and pointer ext
pointing out of the buffer, if the pointer ext points to the terminating
NUL.

* Change termination condition judgment to one place
* Change first condition judgment
Change to not evaluate *(ext -1) in the first condition judgment.

* Change to use copy_option_part instead of STRLCPY
This commit is contained in:
erw7 2019-07-04 21:45:51 +09:00 committed by Justin M. Keyes
parent 99b870d61c
commit efc6d9951b
1 changed files with 10 additions and 4 deletions

View File

@ -24,6 +24,7 @@
#include "nvim/message.h"
#include "nvim/assert.h"
#include "nvim/misc1.h"
#include "nvim/option.h"
#include "nvim/path.h"
#include "nvim/strings.h"
@ -312,7 +313,8 @@ static bool is_executable_ext(char *name, char_u **abspath)
if (!pathext) {
pathext = ".com;.exe;.bat;.cmd";
}
for (const char *ext = pathext; *ext; ext++) {
const char *ext = pathext;
while (*ext) {
// If $PATHEXT itself contains dot:
if (ext[0] == '.' && (ext[1] == '\0' || ext[1] == ENV_SEPCHAR)) {
if (is_executable(name, abspath)) {
@ -320,13 +322,17 @@ static bool is_executable_ext(char *name, char_u **abspath)
}
// Skip it.
ext++;
if (*ext) {
ext++;
}
continue;
}
const char *ext_end = xstrchrnul(ext, ENV_SEPCHAR);
size_t ext_len = (size_t)(ext_end - ext);
const char *ext_end = ext;
size_t ext_len =
copy_option_part((char_u **)&ext_end, (char_u *)buf_end,
sizeof(os_buf) - (size_t)(buf_end - os_buf), ENV_SEPSTR);
if (ext_len != 0) {
STRLCPY(buf_end, ext, ext_len + 1);
bool in_pathext = nameext_len == ext_len
&& 0 == mb_strnicmp((char_u *)nameext, (char_u *)ext, ext_len);