changeset 24634:d3c4ecf67604 v8.2.2856

patch 8.2.2856: get readonly error for device that can't be written to Commit: https://github.com/vim/vim/commit/50157ef1c2e36d8696e79fd688bdd08312196bc6 Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 15 23:21:05 2021 +0200 patch 8.2.2856: get readonly error for device that can't be written to Problem: Get readonly error for device that can't be written to. Solution: Check for being able to write first. (closes https://github.com/vim/vim/issues/8205)
author Bram Moolenaar <Bram@vim.org>
date Sat, 15 May 2021 23:30:02 +0200
parents 9d56f2d21cde
children d3bbbedec49b
files src/ex_cmds.c src/testdir/test_writefile.vim src/version.c
diffstat 3 files changed, 21 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1856,6 +1856,19 @@ ex_write(exarg_T *eap)
 	(void)do_write(eap);
 }
 
+#ifdef UNIX
+    static int
+check_writable(char_u *fname)
+{
+    if (mch_nodetype(fname) == NODE_OTHER)
+    {
+	semsg(_("E503: \"%s\" is not a file or writable device"), fname);
+	return FAIL;
+    }
+    return OK;
+}
+#endif
+
 /*
  * write current buffer to file 'eap->arg'
  * if 'eap->append' is TRUE, append to the file
@@ -1942,7 +1955,11 @@ do_write(exarg_T *eap)
 #ifdef FEAT_QUICKFIX
 		bt_dontwrite_msg(curbuf) ||
 #endif
-		check_fname() == FAIL || check_readonly(&eap->forceit, curbuf)))
+		check_fname() == FAIL
+#ifdef UNIX
+		|| check_writable(curbuf->b_ffname) == FAIL
+#endif
+		|| check_readonly(&eap->forceit, curbuf)))
 	goto theend;
 
     if (!other)
--- a/src/testdir/test_writefile.vim
+++ b/src/testdir/test_writefile.vim
@@ -285,7 +285,7 @@ func Test_write_errors()
         \ && getftype('/dev/loop0') == 'bdev' && !IsRoot()
     new
     edit /dev/loop0
-    call assert_fails('write', 'E505: ')
+    call assert_fails('write', 'E503: ')
     call assert_fails('write!', 'E503: ')
     close!
   endif
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2856,
+/**/
     2855,
 /**/
     2854,