To: vim_dev@googlegroups.com Subject: Patch 8.0.0642 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0642 Problem: writefile() continues after detecting an error. Solution: Bail out as soon as an error is detected. (suggestions by Nikolai Pavlov, closes #1476) Files: src/evalfunc.c, src/testdir/test_writefile.vim *** ../vim-8.0.0641/src/evalfunc.c 2017-06-05 18:46:20.497845949 +0200 --- src/evalfunc.c 2017-06-13 19:34:00.767540909 +0200 *************** *** 13179,13185 **** --- 13179,13188 ---- 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,13207 **** EMSG2(_(e_listarg), "writefile()"); return; } ! if (argvars[0].vval.v_list == NULL) return; if (argvars[2].v_type != VAR_UNKNOWN) { ! if (vim_strchr(get_tv_string(&argvars[2]), 'b') != NULL) binary = TRUE; ! if (vim_strchr(get_tv_string(&argvars[2]), 'a') != NULL) append = TRUE; } /* 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) { --- 13191,13221 ---- EMSG2(_(e_listarg), "writefile()"); 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) { ! char_u *arg2 = get_tv_string_chk(&argvars[2]); ! ! if (arg2 == NULL) ! return; ! if (vim_strchr(arg2, 'b') != NULL) binary = TRUE; ! 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. */ if (*fname == NUL || (fd = mch_fopen((char *)fname, append ? APPENDBIN : WRITEBIN)) == NULL) { *************** *** 13210,13216 **** } else { ! if (write_list(fd, argvars[0].vval.v_list, binary) == FAIL) ret = -1; fclose(fd); } --- 13224,13230 ---- } else { ! if (write_list(fd, list, binary) == FAIL) ret = -1; fclose(fd); } *** ../vim-8.0.0641/src/testdir/test_writefile.vim 2016-09-01 22:07:07.000000000 +0200 --- src/testdir/test_writefile.vim 2017-06-13 19:28:49.369538266 +0200 *************** *** 1,5 **** ! function! Test_WriteFile() let f = tempname() call writefile(["over","written"], f, "b") call writefile(["hello","world"], f, "b") --- 1,6 ---- + " Tests for the writefile() function. ! func Test_writefile() let f = tempname() call writefile(["over","written"], f, "b") call writefile(["hello","world"], f, "b") *************** *** 13,16 **** call assert_equal("morning", l[3]) call assert_equal("vimmers", l[4]) call delete(f) ! endfunction --- 14,33 ---- call assert_equal("morning", l[3]) call assert_equal("vimmers", l[4]) call delete(f) ! endfunc ! ! func Test_writefile_fails_gently() ! call assert_fails('call writefile(["test"], "Xfile", [])', 'E730:') ! call assert_false(filereadable("Xfile")) ! call delete("Xfile") ! ! call assert_fails('call writefile(["test", [], [], [], "tset"], "Xfile")', 'E730:') ! call assert_false(filereadable("Xfile")) ! call delete("Xfile") ! ! call assert_fails('call writefile([], "Xfile", [])', 'E730:') ! call assert_false(filereadable("Xfile")) ! call delete("Xfile") ! ! call assert_fails('call writefile([], [])', 'E730:') ! endfunc *** ../vim-8.0.0641/src/version.c 2017-06-13 17:20:35.691782326 +0200 --- src/version.c 2017-06-13 19:23:42.763610095 +0200 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 642, /**/ -- hundred-and-one symptoms of being an internet addict: 33. You name your children Eudora, Mozilla and Dotcom. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///