diff options
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/fileio.c b/src/fileio.c index a3ac1ae59b..22ab06d8fd 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -3317,7 +3317,7 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit, /* Open with O_EXCL to avoid the file being created while * we were sleeping (symlink hacker attack?) */ bfd = mch_open((char *)backup, - O_WRONLY|O_CREAT|O_EXTRA|O_EXCL, 0666); + O_WRONLY|O_CREAT|O_EXTRA|O_EXCL, perm & 0777); if (bfd < 0) { vim_free(backup); @@ -3701,7 +3701,7 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit, while ((fd = mch_open((char *)wfname, O_WRONLY | O_EXTRA | (append ? (forceit ? (O_APPEND | O_CREAT) : O_APPEND) : (O_CREAT | O_TRUNC)) - , 0666)) < 0) + , perm & 0777)) < 0) { /* * A forced write will try to create a new file if the old one is @@ -4108,7 +4108,8 @@ restore_backup: if ((fd = mch_open((char *)backup, O_RDONLY | O_EXTRA, 0)) >= 0) { if ((write_info.bw_fd = mch_open((char *)fname, - O_WRONLY | O_CREAT | O_TRUNC | O_EXTRA, 0666)) >= 0) + O_WRONLY | O_CREAT | O_TRUNC | O_EXTRA, + perm & 0777)) >= 0) { /* copy the file. */ write_info.bw_buf = smallbuf; @@ -4268,7 +4269,7 @@ restore_backup: if (org == NULL || (empty_fd = mch_open(org, O_CREAT | O_EXTRA | O_EXCL, - 0666)) < 0) + perm & 0777)) < 0) EMSG(_("E206: patchmode: can't touch empty original file")); else close(empty_fd); @@ -5673,6 +5674,7 @@ vim_rename(from, to) BPTR flock; #endif struct stat st; + long perm; /* * When the names are identical, there is nothing to do. @@ -5723,10 +5725,13 @@ vim_rename(from, to) /* * Rename() failed, try copying the file. */ + perm = mch_getperm(from); fd_in = mch_open((char *)from, O_RDONLY|O_EXTRA, 0); if (fd_in == -1) return -1; - fd_out = mch_open((char *)to, O_CREAT|O_EXCL|O_WRONLY|O_EXTRA, 0666); + + /* Create the new file with same permissions as the original. */ + fd_out = mch_open((char *)to, O_CREAT|O_EXCL|O_WRONLY|O_EXTRA, (int)perm); if (fd_out == -1) { close(fd_in); @@ -5757,6 +5762,7 @@ vim_rename(from, to) errmsg = _("E210: Error reading \"%s\""); to = from; } + mch_setperm(to, perm); if (errmsg != NULL) { EMSG2(errmsg, to); |