1
0
forked from aniani/vim

patch 8.0.0642: writefile() continues after detecting an error

Problem:    writefile() continues after detecting an error.
Solution:   Bail out as soon as an error is detected. (suggestions by Nikolai
            Pavlov, closes #1476)
This commit is contained in:
Bram Moolenaar
2017-06-13 19:38:37 +02:00
parent 3ec574f2b5
commit 8cf91286ca
3 changed files with 40 additions and 7 deletions

View File

@@ -13179,7 +13179,10 @@ f_writefile(typval_T *argvars, typval_T *rettv)
char_u *fname;
FILE *fd;
int ret = 0;
listitem_T *li;
list_T *list;
rettv->vval.v_number = -1;
if (check_restricted() || check_secure())
return;
@@ -13188,20 +13191,31 @@ f_writefile(typval_T *argvars, typval_T *rettv)
EMSG2(_(e_listarg), "writefile()");
return;
}
if (argvars[0].vval.v_list == NULL)
list = argvars[0].vval.v_list;
if (list == NULL)
return;
for (li = list->lv_first; li != NULL; li = li->li_next)
if (get_tv_string_chk(&li->li_tv) == NULL)
return;
if (argvars[2].v_type != VAR_UNKNOWN)
{
if (vim_strchr(get_tv_string(&argvars[2]), 'b') != NULL)
char_u *arg2 = get_tv_string_chk(&argvars[2]);
if (arg2 == NULL)
return;
if (vim_strchr(arg2, 'b') != NULL)
binary = TRUE;
if (vim_strchr(get_tv_string(&argvars[2]), 'a') != NULL)
if (vim_strchr(arg2, 'a') != NULL)
append = TRUE;
}
fname = get_tv_string_chk(&argvars[1]);
if (fname == NULL)
return;
/* Always open the file in binary mode, library functions have a mind of
* their own about CR-LF conversion. */
fname = get_tv_string(&argvars[1]);
if (*fname == NUL || (fd = mch_fopen((char *)fname,
append ? APPENDBIN : WRITEBIN)) == NULL)
{
@@ -13210,7 +13224,7 @@ f_writefile(typval_T *argvars, typval_T *rettv)
}
else
{
if (write_list(fd, argvars[0].vval.v_list, binary) == FAIL)
if (write_list(fd, list, binary) == FAIL)
ret = -1;
fclose(fd);
}