From b8c27a83b3d2c99e8a145d86410107f7220b6a75 Mon Sep 17 00:00:00 2001 From: Shougo Matsushita Date: Tue, 21 Jun 2016 19:49:12 +0900 Subject: readfile(): Less-destructive readonly check. Fixes #4162 Fixes #4200 Closes #4944 Regression by 4a138137f78907703aa9215b45f46b8f37d84ae5. That commit mentions a "possible race condition" but the cost isn't worth the (unexplained) gain. --- src/nvim/fileio.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 154558b332..cfce02cf27 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -493,22 +493,13 @@ readfile ( curbuf->b_flags &= ~(BF_NEW | BF_NEW_W); } - /* - * Check readonly by trying to open the file for writing. - * If this fails, we know that the file is readonly. - */ - file_readonly = FALSE; + // Check readonly. + file_readonly = false; if (!read_buffer && !read_stdin) { - if (!newfile || readonlymode) { - file_readonly = TRUE; - } else if ((fd = os_open((char *)fname, O_RDWR, 0)) < 0) { - // opening in readwrite mode failed => file is readonly - file_readonly = TRUE; - } - if (file_readonly == TRUE) { - // try to open readonly - fd = os_open((char *)fname, O_RDONLY, 0); + if (!newfile || readonlymode || !(os_getperm(fname) & 0222)) { + file_readonly = true; } + fd = os_open((char *)fname, O_RDONLY, 0); } if (fd < 0) { /* cannot open at all */ -- cgit From a8d1b5f721f51c1efbe6f55f3515f159ad0dfc8c Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Thu, 4 Aug 2016 01:47:05 -0400 Subject: readfile(): readonly: Also check "not writable". --- src/nvim/fileio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index cfce02cf27..3b598bd64b 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -496,7 +496,8 @@ readfile ( // Check readonly. file_readonly = false; if (!read_buffer && !read_stdin) { - if (!newfile || readonlymode || !(os_getperm(fname) & 0222)) { + if (!newfile || readonlymode || !(perm & 0222) + || !os_file_is_writable((char *)fname)) { file_readonly = true; } fd = os_open((char *)fname, O_RDONLY, 0); -- cgit