]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0566: Stop dir in findfile() doesn't work properly w/o trailing slash v9.1.0566
authorzeertzjq <zeertzjq@outlook.com>
Thu, 11 Jul 2024 20:22:26 +0000 (22:22 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 11 Jul 2024 20:25:54 +0000 (22:25 +0200)
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>
src/findfile.c
src/testdir/test_findfile.vim
src/version.c

index 263660925041697cca594e03e3b5f0376b697f94..149f7c685e518d84b40a7db8e232de2fad2f76c5 100644 (file)
@@ -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;
 }
 
index 311020e26d8026bd8ab2b88b757ba9ec5d8761c1..89e583afa8e985f2b3ea2c8a41b76b6b30931e89 100644 (file)
@@ -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 ../..
index 9c16d1772d4155a785b617e1c89059831f9a43ac..4e14bf18f541d11e38bdabd66ac1a5f6b7baf9a6 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    566,
 /**/
     565,
 /**/