summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-admin/logrotate/files/logrotate-3.10.0-atomic-create.patch')
-rw-r--r--app-admin/logrotate/files/logrotate-3.10.0-atomic-create.patch43
1 files changed, 43 insertions, 0 deletions
diff --git a/app-admin/logrotate/files/logrotate-3.10.0-atomic-create.patch b/app-admin/logrotate/files/logrotate-3.10.0-atomic-create.patch
new file mode 100644
index 000000000000..46c36b8deeb5
--- /dev/null
+++ b/app-admin/logrotate/files/logrotate-3.10.0-atomic-create.patch
@@ -0,0 +1,43 @@
+diff -Nuar a/logrotate.c b/logrotate.c
+--- a/logrotate.c 2016-08-03 23:20:52.900062834 +0200
++++ b/logrotate.c 2016-08-03 23:25:18.080068173 +0200
+@@ -368,15 +368,18 @@
+ int createOutputFile(char *fileName, int flags, struct stat *sb, acl_type acl, int force_mode)
+ {
+ int fd;
+- struct stat sb_create;
+- int acl_set = 0;
+-
+- fd = open(fileName, (flags | O_EXCL | O_NOFOLLOW),
+- (S_IRUSR | S_IWUSR) & sb->st_mode);
++ int acl_set = 0;
++ struct stat sb_create;
++ char template[PATH_MAX + 1];
++ mode_t umask_value;
++ snprintf(template, PATH_MAX, "%s/logrotate_temp.XXXXXX", ourDirName(fileName));
++ umask_value = umask(0000);
++ fd = mkostemp(template, (flags | O_EXCL | O_NOFOLLOW));
++ umask(umask_value);
+
+ if (fd < 0) {
+- message(MESS_ERROR, "error creating output file %s: %s\n",
+- fileName, strerror(errno));
++ message(MESS_ERROR, "error creating unique temp file: %s\n",
++ strerror(errno));
+ return -1;
+ }
+ if (fchmod(fd, (S_IRUSR | S_IWUSR) & sb->st_mode)) {
+@@ -427,6 +430,13 @@
+ }
+ }
+
++ if (rename(template, fileName)) {
++ message(MESS_ERROR, "error renaming temp file to %s: %s\n",
++ fileName, strerror(errno));
++ close(fd);
++ return -1;
++ }
++
+ return fd;
+ }
+