changeset 35649:2807910c5550 v9.1.0566

patch 9.1.0566: Stop dir in findfile() doesn't work properly w/o trailing slash Commit: https://github.com/vim/vim/commit/e6ab23bd4a41840860ae2904956c4d255a9dd528 Author: zeertzjq <zeertzjq@outlook.com> Date: Thu Jul 11 22:22:26 2024 +0200 patch 9.1.0566: Stop dir in findfile() doesn't work properly w/o trailing slash 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>
author Christian Brabandt <cb@256bit.org>
date Thu, 11 Jul 2024 22:30:40 +0200
parents 5606239c517c
children 96d071ff7c29
files src/findfile.c src/testdir/test_findfile.vim src/version.c
diffstat 3 files changed, 21 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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 pa
 	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;
 }
 
--- 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 ../..
--- 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,