0
0
mirror of https://github.com/vim/vim.git synced 2025-09-30 04:44:14 -04:00

patch 9.1.0567: Cannot use relative paths as findfile() stop directories

Problem:  Cannot use relative paths as findfile() stop directories.
Solution: Change a relative path to an absolute path.
          (zeertzjq)

related: #15200
closes: #15202

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2024-07-11 22:24:15 +02:00
committed by Christian Brabandt
parent e6ab23bd4a
commit 764526e279
4 changed files with 39 additions and 7 deletions

View File

@@ -418,6 +418,7 @@ vim_findfile_init(
{ {
char_u *helper; char_u *helper;
void *ptr; void *ptr;
size_t len;
helper = walker; helper = walker;
ptr = vim_realloc(search_ctx->ffsc_stopdirs_v, ptr = vim_realloc(search_ctx->ffsc_stopdirs_v,
@@ -428,18 +429,21 @@ vim_findfile_init(
// ignore, keep what we have and continue // ignore, keep what we have and continue
break; break;
walker = vim_strchr(walker, ';'); walker = vim_strchr(walker, ';');
if (walker) len = walker ? (size_t)(walker - helper) : STRLEN(helper);
// "" means ascent till top of directory tree.
if (*helper != NUL && !vim_isAbsName(helper)
&& len + 1 < MAXPATHL)
{ {
// Make the stop dir an absolute path name.
vim_strncpy(ff_expand_buffer, helper, len);
search_ctx->ffsc_stopdirs_v[dircount-1] = search_ctx->ffsc_stopdirs_v[dircount-1] =
vim_strnsave(helper, walker - helper); FullName_save(ff_expand_buffer, FALSE);
walker++;
} }
else else
// this might be "", which means ascent till top
// of directory tree.
search_ctx->ffsc_stopdirs_v[dircount-1] = search_ctx->ffsc_stopdirs_v[dircount-1] =
vim_strsave(helper); vim_strnsave(helper, len);
if (walker)
walker++;
dircount++; dircount++;
} while (walker != NULL); } while (walker != NULL);

View File

@@ -98,12 +98,25 @@ func Test_findfile()
" Test upwards search with stop-directory. " Test upwards search with stop-directory.
cd Xdir2 cd Xdir2
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/Xdir3/', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/Xdir3', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';../', -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) let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/', -1)
call assert_equal(1, len(l)) call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2', -1) let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2', -1)
call assert_equal(1, len(l)) call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';../../', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/', -1) let l = findfile('bar', ';' . save_dir . '/Xfinddir1/', -1)
call assert_equal(2, len(l)) call assert_equal(2, len(l))
@@ -113,6 +126,10 @@ func Test_findfile()
call assert_equal(2, len(l)) call assert_equal(2, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0]) call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
call assert_match('.*/Xfinddir1/bar', l[1]) call assert_match('.*/Xfinddir1/bar', l[1])
let l = findfile('bar', ';../../../', -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/. " Test combined downwards and upwards search from Xdir2/.
cd ../.. cd ../..

View File

@@ -146,6 +146,15 @@ func Test_tagfiles_stopdir()
let &tags = './Xtags;' .. fnamemodify('./..', ':p') let &tags = './Xtags;' .. fnamemodify('./..', ':p')
call assert_equal(0, len(tagfiles())) call assert_equal(0, len(tagfiles()))
let &tags = './Xtags;../'
call assert_equal(0, len(tagfiles()))
cd ..
call assert_equal(1, len(tagfiles()))
cd ..
call assert_equal(1, len(tagfiles()))
set tags& set tags&
call chdir(save_cwd) call chdir(save_cwd)
endfunc endfunc

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
567,
/**/ /**/
566, 566,
/**/ /**/