readfile(): Less-destructive readonly check.

Fixes #4162
Fixes #4200
Closes #4944

Regression by 4a138137f7. That commit mentions
a "possible race condition" but the cost isn't worth the (unexplained) gain.
This commit is contained in:
Shougo Matsushita 2016-06-21 19:49:12 +09:00 committed by Justin M. Keyes
parent 0d93cd6c46
commit b8c27a83b3

View File

@ -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 */