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);
     }