summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/testdir/test_backup.vim27
-rw-r--r--src/testdir/test_edit.vim1
-rw-r--r--src/testdir/test_viminfo.vim2
-rw-r--r--src/testdir/test_writefile.vim28
-rw-r--r--src/version.c2
-rw-r--r--src/viminfo.c35
6 files changed, 52 insertions, 43 deletions
diff --git a/src/testdir/test_backup.vim b/src/testdir/test_backup.vim
index 0d3e79c22..4c7abe8e5 100644
--- a/src/testdir/test_backup.vim
+++ b/src/testdir/test_backup.vim
@@ -19,6 +19,22 @@ func Test_backup()
call delete('Xbackup.txt~')
endfunc
+func Test_backup_backupskip()
+ set backup backupdir=. backupskip=*.txt
+ new
+ call setline(1, ['line1', 'line2'])
+ :f Xbackup.txt
+ :w! Xbackup.txt
+ " backup file is only created after
+ " writing a second time (before overwriting)
+ :w! Xbackup.txt
+ call assert_false(filereadable('Xbackup.txt~'))
+ bw!
+ set backup&vim backupdir&vim backupskip&vim
+ call delete('Xbackup.txt')
+ call delete('Xbackup.txt~')
+endfunc
+
func Test_backup2()
set backup backupdir=.// backupskip=
new
@@ -30,7 +46,7 @@ func Test_backup2()
:w! Xbackup.txt
sp *Xbackup.txt~
call assert_equal(['line1', 'line2', 'line3'], getline(1,'$'))
- let f=expand('%')
+ let f = expand('%')
call assert_match('%testdir%Xbackup.txt\~', f)
bw!
bw!
@@ -50,7 +66,7 @@ func Test_backup2_backupcopy()
:w! Xbackup.txt
sp *Xbackup.txt~
call assert_equal(['line1', 'line2', 'line3'], getline(1,'$'))
- let f=expand('%')
+ let f = expand('%')
call assert_match('%testdir%Xbackup.txt\~', f)
bw!
bw!
@@ -61,14 +77,11 @@ endfunc
" Test for using a non-existing directory as a backup directory
func Test_non_existing_backupdir()
- CheckNotBSD
- let save_backup = &backupdir
- set backupdir=./non_existing_dir
+ set backupdir=./non_existing_dir backupskip=
call writefile(['line1'], 'Xfile')
new Xfile
- " TODO: write doesn't fail in Cirrus FreeBSD CI test
call assert_fails('write', 'E510:')
- let &backupdir = save_backup
+ set backupdir&vim backupskip&vim
call delete('Xfile')
endfunc
diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim
index 0200d9f56..5277d20b7 100644
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -1682,7 +1682,6 @@ endfunc
" Test for editing a file without read permission
func Test_edit_file_no_read_perm()
CheckUnix
- CheckNotBSD
call writefile(['one', 'two'], 'Xfile')
call setfperm('Xfile', '-w-------')
new
diff --git a/src/testdir/test_viminfo.vim b/src/testdir/test_viminfo.vim
index 258b472bb..bc8afa0e1 100644
--- a/src/testdir/test_viminfo.vim
+++ b/src/testdir/test_viminfo.vim
@@ -807,7 +807,7 @@ func Test_viminfo_perm()
" Try to write the viminfo to a directory
call mkdir('Xdir')
- call assert_fails('wviminfo Xdir', 'E886:')
+ call assert_fails('wviminfo Xdir', 'E137:')
call delete('Xdir', 'rf')
endfunc
diff --git a/src/testdir/test_writefile.vim b/src/testdir/test_writefile.vim
index d6e7e64c1..e58093074 100644
--- a/src/testdir/test_writefile.vim
+++ b/src/testdir/test_writefile.vim
@@ -136,9 +136,7 @@ func Test_writefile_sync_arg()
endfunc
func Test_writefile_sync_dev_stdout()
- if !has('unix')
- return
- endif
+ CheckUnix
if filewritable('/dev/stdout')
" Just check that this doesn't cause an error.
call writefile(['one'], '/dev/stdout')
@@ -371,13 +369,10 @@ endfunc
" Test for writing to a readonly file
func Test_write_readonly()
- " In Cirrus-CI, the freebsd tests are run under a root account. So this test
- " doesn't fail.
- CheckNotBSD
call writefile([], 'Xfile')
call setfperm('Xfile', "r--------")
edit Xfile
- set noreadonly
+ set noreadonly backupskip=
call assert_fails('write', 'E505:')
let save_cpo = &cpo
set cpo+=W
@@ -386,37 +381,32 @@ func Test_write_readonly()
call setline(1, ['line1'])
write!
call assert_equal(['line1'], readfile('Xfile'))
+ set backupskip&
call delete('Xfile')
endfunc
" Test for 'patchmode'
func Test_patchmode()
- CheckNotBSD
call writefile(['one'], 'Xfile')
- set patchmode=.orig nobackup writebackup
+ set patchmode=.orig nobackup backupskip= writebackup
new Xfile
call setline(1, 'two')
" first write should create the .orig file
write
- " TODO: Xfile.orig is not created in Cirrus FreeBSD CI test
call assert_equal(['one'], readfile('Xfile.orig'))
call setline(1, 'three')
" subsequent writes should not create/modify the .orig file
write
call assert_equal(['one'], readfile('Xfile.orig'))
- set patchmode& backup& writebackup&
+ set patchmode& backup& backupskip& writebackup&
call delete('Xfile')
call delete('Xfile.orig')
endfunc
" Test for writing to a file in a readonly directory
func Test_write_readonly_dir()
- if !has('unix') || has('bsd')
- " On MS-Windows, modifying files in a read-only directory is allowed.
- " In Cirrus-CI for Freebsd, tests are run under a root account where
- " modifying files in a read-only directory are allowed.
- return
- endif
+ " On MS-Windows, modifying files in a read-only directory is allowed.
+ CheckUnix
call mkdir('Xdir')
call writefile(['one'], 'Xdir/Xfile1')
call setfperm('Xdir', 'r-xr--r--')
@@ -426,12 +416,12 @@ func Test_write_readonly_dir()
call assert_fails('write', 'E212:')
" try to create a backup file in the directory
edit! Xdir/Xfile1
- set backupdir=./Xdir
+ set backupdir=./Xdir backupskip=
set patchmode=.orig
call assert_fails('write', 'E509:')
call setfperm('Xdir', 'rwxr--r--')
call delete('Xdir', 'rf')
- set backupdir& patchmode&
+ set backupdir& backupskip& patchmode&
endfunc
" Test for writing a file using invalid file encoding
diff --git a/src/version.c b/src/version.c
index cc92f22e9..7026eebbe 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1340,
+/**/
1339,
/**/
1338,
diff --git a/src/viminfo.c b/src/viminfo.c
index 4f26348a2..74780c3d0 100644
--- a/src/viminfo.c
+++ b/src/viminfo.c
@@ -3007,6 +3007,7 @@ read_viminfo(
{
FILE *fp;
char_u *fname;
+ stat_T st; // mch_stat() of existing viminfo file
if (no_viminfo())
return FAIL;
@@ -3031,6 +3032,11 @@ read_viminfo(
vim_free(fname);
if (fp == NULL)
return FAIL;
+ if (mch_fstat(fileno(fp), &st) < 0 || S_ISDIR(st.st_mode))
+ {
+ fclose(fp);
+ return FAIL;
+ }
viminfo_errcnt = 0;
do_viminfo(fp, NULL, flags);
@@ -3054,12 +3060,12 @@ write_viminfo(char_u *file, int forceit)
FILE *fp_out = NULL; // output viminfo file
char_u *tempname = NULL; // name of temp viminfo file
stat_T st_new; // mch_stat() of potential new file
+ stat_T st_old; // mch_stat() of existing viminfo file
#if defined(UNIX) || defined(VMS)
mode_t umask_save;
#endif
#ifdef UNIX
int shortname = FALSE; // use 8.3 file name
- stat_T st_old; // mch_stat() of existing viminfo file
#endif
#ifdef MSWIN
int hidden = FALSE;
@@ -3097,20 +3103,20 @@ write_viminfo(char_u *file, int forceit)
// write the new viminfo into, in the same directory as the
// existing viminfo file, which will be renamed once all writing is
// successful.
+ if (mch_fstat(fileno(fp_in), &st_old) < 0
+ || S_ISDIR(st_old.st_mode)
#ifdef UNIX
- // For Unix we check the owner of the file. It's not very nice to
- // overwrite a user's viminfo file after a "su root", with a
- // viminfo file that the user can't read.
- st_old.st_dev = (dev_t)0;
- st_old.st_ino = 0;
- st_old.st_mode = 0600;
- if (mch_stat((char *)fname, &st_old) == 0
- && getuid() != ROOT_UID
- && !(st_old.st_uid == getuid()
- ? (st_old.st_mode & 0200)
- : (st_old.st_gid == getgid()
- ? (st_old.st_mode & 0020)
- : (st_old.st_mode & 0002))))
+ // For Unix we check the owner of the file. It's not very nice
+ // to overwrite a user's viminfo file after a "su root", with a
+ // viminfo file that the user can't read.
+ || (getuid() != ROOT_UID
+ && !(st_old.st_uid == getuid()
+ ? (st_old.st_mode & 0200)
+ : (st_old.st_gid == getgid()
+ ? (st_old.st_mode & 0020)
+ : (st_old.st_mode & 0002))))
+#endif
+ )
{
int tt = msg_didany;
@@ -3120,7 +3126,6 @@ write_viminfo(char_u *file, int forceit)
fclose(fp_in);
goto end;
}
-#endif
#ifdef MSWIN
// Get the file attributes of the existing viminfo file.
hidden = mch_ishidden(fname);