Mercurial > vim
diff src/evalfunc.c @ 11519:4a1f7849fe86 v8.0.0642
patch 8.0.0642: writefile() continues after detecting an error
commit https://github.com/vim/vim/commit/8cf91286ca46a501d24e4b7d631b193256782c88
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jun 13 19:38:37 2017 +0200
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 13 Jun 2017 19:45:03 +0200 |
parents | 3933a3bf9385 |
children | 578df034735d |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -13179,7 +13179,10 @@ f_writefile(typval_T *argvars, typval_T 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 EMSG2(_(e_listarg), "writefile()"); return; } - if (argvars[0].vval.v_list == NULL) - return; + 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 } else { - if (write_list(fd, argvars[0].vval.v_list, binary) == FAIL) + if (write_list(fd, list, binary) == FAIL) ret = -1; fclose(fd); }