summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-07-11 22:22:26 +0200
committerChristian Brabandt <cb@256bit.org>2024-07-11 22:25:54 +0200
commite6ab23bd4a41840860ae2904956c4d255a9dd528 (patch)
treef388186811033dc3063904319eb940bb1e70f0d3
parent68819afb2cdd0f44baa080db589e1d8f77099e5f (diff)
patch 9.1.0566: Stop dir in findfile() doesn't work properly w/o trailing slashv9.1.0566
Problem: Stop directory in findfile() doesn't work properly without a trailing slash. Solution: Always use fnamencmp(), not fnamecmp(). related: #15200 related: #15202 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/findfile.c30
-rw-r--r--src/testdir/test_findfile.vim7
-rw-r--r--src/version.c2
3 files changed, 21 insertions, 18 deletions
diff --git a/src/findfile.c b/src/findfile.c
index 2636609250..149f7c685e 100644
--- a/src/findfile.c
+++ b/src/findfile.c
@@ -1078,11 +1078,13 @@ vim_findfile(void *search_ctx_arg)
&& search_ctx->ffsc_stopdirs_v != NULL && !got_int)
{
ff_stack_T *sptr;
+ // path_end may point to the NUL or the previous path separator
+ int plen = (path_end - search_ctx->ffsc_start_dir)
+ + (*path_end != NUL);
// is the last starting directory in the stop list?
if (ff_path_in_stoplist(search_ctx->ffsc_start_dir,
- (int)(path_end - search_ctx->ffsc_start_dir),
- search_ctx->ffsc_stopdirs_v) == TRUE)
+ plen, search_ctx->ffsc_stopdirs_v) == TRUE)
break;
// cut of last dir
@@ -1521,22 +1523,14 @@ ff_path_in_stoplist(char_u *path, int path_len, char_u **stopdirs_v)
return TRUE;
for (i = 0; stopdirs_v[i] != NULL; i++)
- {
- if ((int)STRLEN(stopdirs_v[i]) > path_len)
- {
- // match for parent directory. So '/home' also matches
- // '/home/rks'. Check for PATHSEP in stopdirs_v[i], else
- // '/home/r' would also match '/home/rks'
- if (fnamencmp(stopdirs_v[i], path, path_len) == 0
- && vim_ispathsep(stopdirs_v[i][path_len]))
- return TRUE;
- }
- else
- {
- if (fnamecmp(stopdirs_v[i], path) == 0)
- return TRUE;
- }
- }
+ // match for parent directory. So '/home' also matches
+ // '/home/rks'. Check for PATHSEP in stopdirs_v[i], else
+ // '/home/r' would also match '/home/rks'
+ if (fnamencmp(stopdirs_v[i], path, path_len) == 0
+ && ((int)STRLEN(stopdirs_v[i]) <= path_len
+ || vim_ispathsep(stopdirs_v[i][path_len])))
+ return TRUE;
+
return FALSE;
}
diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim
index 311020e26d..89e583afa8 100644
--- a/src/testdir/test_findfile.vim
+++ b/src/testdir/test_findfile.vim
@@ -101,11 +101,18 @@ func Test_findfile()
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2', -1)
+ call assert_equal(1, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/', -1)
call assert_equal(2, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
call assert_match('.*/Xfinddir1/bar', l[1])
+ let l = findfile('bar', ';' . save_dir . '/Xfinddir1', -1)
+ call assert_equal(2, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ call assert_match('.*/Xfinddir1/bar', l[1])
" Test combined downwards and upwards search from Xdir2/.
cd ../..
diff --git a/src/version.c b/src/version.c
index 9c16d1772d..4e14bf18f5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 566,
+/**/
565,
/**/
564,