summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/editing.txt6
-rw-r--r--src/findfile.c9
-rw-r--r--src/testdir/test_findfile.vim22
-rw-r--r--src/version.c2
4 files changed, 39 insertions, 0 deletions
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
index 233179868..6bc245abc 100644
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -1749,6 +1749,12 @@ There are three different types of searching:
/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
index a72fe45ad..7c2a61f4a 100644
--- 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
index 188851fee..017089eac 100644
--- 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
index 9b334e674..ac5989f6f 100644
--- 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,