# HG changeset patch # User Bram Moolenaar # Date 1627218904 -7200 # Node ID af5c4fabcf4033ad05776f186612be01b93a4c4a # Parent 3ec88da38ae25935e3024c3569f25c26908cbdab patch 8.2.3219: :find searches non-existing directories Commit: https://github.com/vim/vim/commit/7a4ca32175bef0f9a177052796bd9addd10dc218 Author: Christian Brabandt Date: Sun Jul 25 15:08:05 2021 +0200 patch 8.2.3219: :find searches non-existing directories Problem: :find searches non-existing directories. Solution: Check the path is not "..". Update help. (Christian Brabandt, closes #8612, closes #8533) diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt --- a/runtime/doc/editing.txt +++ b/runtime/doc/editing.txt @@ -1749,6 +1749,12 @@ 2) Upward search: /u/user_x/work/include /u/user_x/include +< Note: If your 'path' setting includes an non-existing directory, Vim will + skip the non-existing directory, but continues searching in the parent of + the non-existing directory if upwards searching is used. E.g. when + searching "../include" and that doesn't exist, and upward searching is + used, also searches in "..". + 3) Combined up/downward search: If Vim's current path is /u/user_x/work/release and you do > set path=**;/u/user_x diff --git a/src/findfile.c b/src/findfile.c --- a/src/findfile.c +++ b/src/findfile.c @@ -578,7 +578,16 @@ vim_findfile_init( if (p > search_ctx->ffsc_fix_path) { + // do not add '..' to the path and start upwards searching len = (int)(p - search_ctx->ffsc_fix_path) - 1; + if ((len >= 2 + && STRNCMP(search_ctx->ffsc_fix_path, "..", 2) == 0) + && (len == 2 + || search_ctx->ffsc_fix_path[2] == PATHSEP)) + { + vim_free(buf); + goto error_return; + } STRNCAT(ff_expand_buffer, search_ctx->ffsc_fix_path, len); add_pathsep(ff_expand_buffer); } diff --git a/src/testdir/test_findfile.vim b/src/testdir/test_findfile.vim --- a/src/testdir/test_findfile.vim +++ b/src/testdir/test_findfile.vim @@ -228,4 +228,26 @@ func Test_find_cmd() call assert_fails('tabfind', 'E471:') endfunc +func Test_find_non_existing_path() + new + let save_path = &path + let save_dir = getcwd() + call mkdir('dir1/dir2', 'p') + call writefile([], 'dir1/file.txt') + call writefile([], 'dir1/dir2/base.txt') + call chdir('dir1/dir2') + e base.txt + set path=../include + + call assert_fails(':find file.txt', 'E345:') + + call chdir(save_dir) + bw! + call delete('dir1/dir2/base.txt', 'rf') + call delete('dir1/dir2', 'rf') + call delete('dir1/file.txt', 'rf') + call delete('dir1', 'rf') + let &path = save_path +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3219, +/**/ 3218, /**/ 3217,