summaryrefslogtreecommitdiff
path: root/src/os_unix.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-11-16 17:03:45 +0100
committerBram Moolenaar <Bram@vim.org>2017-11-16 17:03:45 +0100
commitcd142e3369db8888163a511dbe9907bcd138829c (patch)
treeda7a202c6d0d9c3074d285e229133855e7d8c298 /src/os_unix.c
parenta42ad57e481d6ed9c34c80c99bd0512d4660515b (diff)
downloadvim-git-8.0.1300.tar.gz
patch 8.0.1300: file permissions may end up wrong when writingv8.0.1300
Problem: File permissions may end up wrong when writing. Solution: Use fchmod() instead of chmod() when possible. Don't truncate until we know we can change the file.
Diffstat (limited to 'src/os_unix.c')
-rw-r--r--src/os_unix.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index a39caffe4..d2f080529 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -2725,9 +2725,8 @@ mch_getperm(char_u *name)
}
/*
- * set file permission for 'name' to 'perm'
- *
- * return FAIL for failure, OK otherwise
+ * Set file permission for "name" to "perm".
+ * Return FAIL for failure, OK otherwise.
*/
int
mch_setperm(char_u *name, long perm)
@@ -2741,6 +2740,18 @@ mch_setperm(char_u *name, long perm)
(mode_t)perm) == 0 ? OK : FAIL);
}
+#if defined(HAVE_FCHMOD) || defined(PROTO)
+/*
+ * Set file permission for open file "fd" to "perm".
+ * Return FAIL for failure, OK otherwise.
+ */
+ int
+mch_fsetperm(int fd, long perm)
+{
+ return (fchmod(fd, (mode_t)perm) == 0 ? OK : FAIL);
+}
+#endif
+
#if defined(HAVE_ACL) || defined(PROTO)
# ifdef HAVE_SYS_ACL_H
# include <sys/acl.h>