Compare commits
No commits in common. 'c9' and 'i10c-beta' have entirely different histories.
@ -1 +1 @@
|
||||
SOURCES/logrotate-3.18.0.tar.xz
|
||||
SOURCES/logrotate-3.22.0.tar.xz
|
||||
|
@ -1 +1 @@
|
||||
6b9aa5efd4551377e9869e8d3303d90a946566f6 SOURCES/logrotate-3.18.0.tar.xz
|
||||
682ada0694f18c300d6df322cd46b95aafa9510a SOURCES/logrotate-3.22.0.tar.xz
|
||||
|
@ -1,615 +0,0 @@
|
||||
From 471cf0a6a90e5d45f116f404e1276ea730dbece6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Fri, 26 Mar 2021 17:18:09 +0100
|
||||
Subject: [PATCH 1/9] Do not report OOM incorrectly
|
||||
|
||||
In case there is no file in the set to rotate `calloc(0, ...)` is called
|
||||
, which might return NULL.
|
||||
|
||||
Order the check for a zero number of files first, to void calling calloc
|
||||
with a size of zero.
|
||||
|
||||
Upstream-commit: 7b65b267d73970eb59061be907c8c35b4396ada9
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index 507c85a..a8c8480 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -2212,11 +2212,6 @@ static int rotateLogSet(const struct logInfo *log, int force)
|
||||
struct logState **state;
|
||||
struct logNames **rotNames;
|
||||
|
||||
- logHasErrors = calloc(log->numFiles, sizeof(int));
|
||||
- if (!logHasErrors) {
|
||||
- message_OOM();
|
||||
- return 1;
|
||||
- }
|
||||
message(MESS_DEBUG, "\nrotating pattern: %s ", log->pattern);
|
||||
if (force) {
|
||||
message(MESS_DEBUG, "forced from command line ");
|
||||
@@ -2277,10 +2272,15 @@ static int rotateLogSet(const struct logInfo *log, int force)
|
||||
|
||||
if (log->numFiles == 0) {
|
||||
message(MESS_DEBUG, "No logs found. Rotation not needed.\n");
|
||||
- free(logHasErrors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ logHasErrors = calloc(log->numFiles, sizeof(int));
|
||||
+ if (!logHasErrors) {
|
||||
+ message_OOM();
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
if (log->flags & LOG_FLAG_SU) {
|
||||
if (switch_user(log->suUid, log->suGid) != 0) {
|
||||
free(logHasErrors);
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From 96203f4cdc64e2df3d203231bd1247424a20875e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 19 Apr 2021 15:35:37 +0200
|
||||
Subject: [PATCH 2/9] Unify asprintf usage
|
||||
|
||||
Unify the error checking of asprintf(3).
|
||||
|
||||
Also reset the target string pointer to NULL on error, if it is non-
|
||||
local, since the content is undefined according to the specification.
|
||||
|
||||
Also fix potential NULL-pointer usage in sprintf(3):
|
||||
|
||||
logrotate.c:1595:
|
||||
rotNames->dirName = malloc(strlen(ld) + strlen(log->oldDir) + 2);
|
||||
sprintf(rotNames->dirName, "%s/%s", ld, log->oldDir);
|
||||
|
||||
Upstream-commit: 5afcdeecc5a3bfe07671a3c05c7a301da9206ccd
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
config.c | 28 +++++++++++++---------------
|
||||
logrotate.c | 9 ++++++---
|
||||
2 files changed, 19 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/config.c b/config.c
|
||||
index df2d90b..19dcfce 100644
|
||||
--- a/config.c
|
||||
+++ b/config.c
|
||||
@@ -815,21 +815,19 @@ int readAllConfigPaths(const char **paths)
|
||||
|
||||
|
||||
for (i = 0; i < defTabooCount; i++) {
|
||||
- int bytes;
|
||||
char *pattern = NULL;
|
||||
|
||||
/* generate a pattern by concatenating star (wildcard) to the
|
||||
* suffix literal
|
||||
*/
|
||||
- bytes = asprintf(&pattern, "*%s", defTabooExts[i]);
|
||||
- if (bytes != -1) {
|
||||
- tabooPatterns[i] = pattern;
|
||||
- tabooCount++;
|
||||
- } else {
|
||||
+ if (asprintf(&pattern, "*%s", defTabooExts[i]) < 0) {
|
||||
free_2d_array(tabooPatterns, tabooCount);
|
||||
message_OOM();
|
||||
return 1;
|
||||
}
|
||||
+
|
||||
+ tabooPatterns[i] = pattern;
|
||||
+ tabooCount++;
|
||||
}
|
||||
|
||||
for (file = paths; *file; file++) {
|
||||
@@ -1421,7 +1419,6 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
}
|
||||
|
||||
while (*endtag) {
|
||||
- int bytes;
|
||||
char *pattern = NULL;
|
||||
|
||||
chptr = endtag;
|
||||
@@ -1437,10 +1434,11 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
RAISE_ERROR();
|
||||
}
|
||||
tabooPatterns = tmp;
|
||||
- bytes = asprintf(&pattern, "*%.*s", (int)(chptr - endtag), endtag);
|
||||
+ if (asprintf(&pattern, "*%.*s", (int)(chptr - endtag), endtag) < 0) {
|
||||
+ message_OOM();
|
||||
+ RAISE_ERROR();
|
||||
+ }
|
||||
|
||||
- /* should test for malloc() failure */
|
||||
- assert(bytes != -1);
|
||||
tabooPatterns[tabooCount] = pattern;
|
||||
tabooCount++;
|
||||
}
|
||||
@@ -1481,7 +1479,6 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
}
|
||||
|
||||
while (*endtag) {
|
||||
- int bytes;
|
||||
char *pattern = NULL;
|
||||
char **tmp;
|
||||
|
||||
@@ -1496,10 +1493,11 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
RAISE_ERROR();
|
||||
}
|
||||
tabooPatterns = tmp;
|
||||
- bytes = asprintf(&pattern, "%.*s", (int)(chptr - endtag), endtag);
|
||||
+ if (asprintf(&pattern, "%.*s", (int)(chptr - endtag), endtag) < 0) {
|
||||
+ message_OOM();
|
||||
+ RAISE_ERROR();
|
||||
+ }
|
||||
|
||||
- /* should test for malloc() failure */
|
||||
- assert(bytes != -1);
|
||||
tabooPatterns[tabooCount] = pattern;
|
||||
tabooCount++;
|
||||
|
||||
@@ -1540,7 +1538,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
env_home = pwd->pw_dir;
|
||||
}
|
||||
|
||||
- if (asprintf(&new_key, "%s/%s", env_home, key + 2) == -1) {
|
||||
+ if (asprintf(&new_key, "%s/%s", env_home, key + 2) < 0) {
|
||||
message_OOM();
|
||||
RAISE_ERROR();
|
||||
}
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index a8c8480..e294352 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -1576,9 +1576,9 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
ld = dirname(logpath);
|
||||
if (log->oldDir) {
|
||||
if (log->oldDir[0] != '/') {
|
||||
- rotNames->dirName =
|
||||
- malloc(strlen(ld) + strlen(log->oldDir) + 2);
|
||||
- sprintf(rotNames->dirName, "%s/%s", ld, log->oldDir);
|
||||
+ if (asprintf(&rotNames->dirName, "%s/%s", ld, log->oldDir) < 0) {
|
||||
+ rotNames->dirName = NULL;
|
||||
+ }
|
||||
} else
|
||||
rotNames->dirName = strdup(log->oldDir);
|
||||
} else
|
||||
@@ -1983,6 +1983,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
if (asprintf(&(rotNames->finalName), "%s/%s%s%s", rotNames->dirName,
|
||||
rotNames->baseName, dext_str, fileext) < 0) {
|
||||
message_OOM();
|
||||
+ rotNames->finalName = NULL;
|
||||
return 1;
|
||||
}
|
||||
if (asprintf(&destFile, "%s%s", rotNames->finalName, compext) < 0) {
|
||||
@@ -2001,6 +2002,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
if (asprintf(&(rotNames->finalName), "%s/%s.%d%s", rotNames->dirName,
|
||||
rotNames->baseName, logStart, fileext) < 0) {
|
||||
message_OOM();
|
||||
+ rotNames->finalName = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2084,6 +2086,7 @@ static int rotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
free(rotNames->disposeName);
|
||||
if (asprintf(&rotNames->disposeName, "%s%s", rotNames->finalName, ext) < 0) {
|
||||
message_OOM();
|
||||
+ rotNames->disposeName = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From 3cf921e0d58993b064cd6d52b44835008345f498 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 19 Apr 2021 15:40:19 +0200
|
||||
Subject: [PATCH 3/9] Update custom asprintf implementation
|
||||
|
||||
Check for vsnprintf(3) failures.
|
||||
|
||||
Silence conversion warnings.
|
||||
|
||||
Do not call exit(2) on allocation failure, but return -1 like the
|
||||
specification says. All callers check the return value, since they
|
||||
need to handle standard asprintf(3) implementations.
|
||||
|
||||
Upstream-commit: f917b31dbb47992bf5c5342c7312ddb2e64efc40
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
config.c | 20 ++++++++------------
|
||||
1 file changed, 8 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/config.c b/config.c
|
||||
index 19dcfce..0d79980 100644
|
||||
--- a/config.c
|
||||
+++ b/config.c
|
||||
@@ -61,24 +61,20 @@ int asprintf(char **string_ptr, const char *format, ...)
|
||||
|
||||
va_start(arg, format);
|
||||
size = vsnprintf(NULL, 0, format, arg);
|
||||
- size++;
|
||||
va_end(arg);
|
||||
- va_start(arg, format);
|
||||
- str = malloc(size);
|
||||
+ if (size < 0) {
|
||||
+ return -1;
|
||||
+ }
|
||||
+ str = malloc((size_t)size + 1);
|
||||
if (str == NULL) {
|
||||
- va_end(arg);
|
||||
- /*
|
||||
- * Strictly speaking, GNU asprintf doesn't do this,
|
||||
- * but the caller isn't checking the return value.
|
||||
- */
|
||||
- message_OOM();
|
||||
- exit(1);
|
||||
+ return -1;
|
||||
}
|
||||
- rv = vsnprintf(str, size, format, arg);
|
||||
+ va_start(arg, format);
|
||||
+ rv = vsnprintf(str, (size_t)size + 1, format, arg);
|
||||
va_end(arg);
|
||||
|
||||
*string_ptr = str;
|
||||
- return (rv);
|
||||
+ return rv;
|
||||
}
|
||||
|
||||
#endif
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From ace9818a606a0c96bb6e4da479ed151650b8fa3a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 19 Apr 2021 15:45:55 +0200
|
||||
Subject: [PATCH 4/9] Use asprintf instead of split malloc + sprintf
|
||||
|
||||
Use asprintf(3) instead of split usage of malloc(3) and sprintf(3) to
|
||||
reduce the chance of potential size inconsistencies.
|
||||
|
||||
Upstream-commit: 001352baa924f021748513b6d09d37eca754d5cc
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
config.c | 5 ++---
|
||||
logrotate.c | 25 ++++++++++++-------------
|
||||
2 files changed, 14 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/config.c b/config.c
|
||||
index 0d79980..2905ff7 100644
|
||||
--- a/config.c
|
||||
+++ b/config.c
|
||||
@@ -1886,13 +1886,12 @@ duperror:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
- ld = malloc(strlen(dirName) + strlen(newlog->oldDir) + 2);
|
||||
- if (ld == NULL) {
|
||||
+ if (asprintf(&ld, "%s/%s", dirName, newlog->oldDir) < 0) {
|
||||
message_OOM();
|
||||
free(dirpath);
|
||||
goto error;
|
||||
}
|
||||
- sprintf(ld, "%s/%s", dirName, newlog->oldDir);
|
||||
+
|
||||
free(dirpath);
|
||||
|
||||
if (newlog->oldDir[0] != '/') {
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index e294352..a72329e 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -1810,15 +1810,6 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
}
|
||||
}
|
||||
|
||||
- /* adding 2 due to / and \0 being added by snprintf */
|
||||
- rotNames->firstRotated =
|
||||
- malloc(strlen(rotNames->dirName) + strlen(rotNames->baseName) +
|
||||
- strlen(fileext) + strlen(compext) + DATEEXT_LEN + 2 );
|
||||
- if (rotNames->firstRotated == NULL) {
|
||||
- message_OOM();
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
if (log->flags & LOG_FLAG_DATEEXT) {
|
||||
/* glob for compressed files with our pattern
|
||||
* and compress ext */
|
||||
@@ -1882,9 +1873,13 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
rotNames->disposeName = NULL;
|
||||
}
|
||||
/* firstRotated is most recently created/compressed rotated log */
|
||||
- sprintf(rotNames->firstRotated, "%s/%s%s%s%s",
|
||||
+ if (asprintf(&rotNames->firstRotated, "%s/%s%s%s%s",
|
||||
rotNames->dirName, rotNames->baseName, dext_str, fileext,
|
||||
- (log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext);
|
||||
+ (log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext) < 0) {
|
||||
+ message_OOM();
|
||||
+ rotNames->firstRotated = NULL;
|
||||
+ return 1;
|
||||
+ }
|
||||
globfree(&globResult);
|
||||
free(glob_pattern);
|
||||
} else {
|
||||
@@ -1915,9 +1910,13 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
}
|
||||
}
|
||||
|
||||
- sprintf(rotNames->firstRotated, "%s/%s.%d%s%s", rotNames->dirName,
|
||||
+ if (asprintf(&rotNames->firstRotated, "%s/%s.%d%s%s", rotNames->dirName,
|
||||
rotNames->baseName, logStart, fileext,
|
||||
- (log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext);
|
||||
+ (log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext) < 0) {
|
||||
+ message_OOM();
|
||||
+ rotNames->firstRotated = NULL;
|
||||
+ return 1;
|
||||
+ }
|
||||
|
||||
for (i = rotateCount + logStart - 1; (i >= 0) && !hasErrors; i--) {
|
||||
free(newName);
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From e8a655ef1977add152d79c4dc8148fe7b1c9bca2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 19 Apr 2021 17:52:48 +0200
|
||||
Subject: [PATCH 5/9] Mark read-only string variable const
|
||||
|
||||
Prevent it accidentally being passed to free(3) or similar.
|
||||
|
||||
Upstream-commit: 2231aba823ff6e5a18d996e81ef63df0871224dd
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index a72329e..7d49261 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -1567,7 +1567,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
state->lastRotated = now;
|
||||
|
||||
{
|
||||
- char *ld;
|
||||
+ const char *ld;
|
||||
char *logpath = strdup(log->files[logNum]);
|
||||
if (logpath == NULL) {
|
||||
message_OOM();
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From c06f20f781c74b2256e8f1757433db7e043b4ddf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 19 Apr 2021 17:59:21 +0200
|
||||
Subject: [PATCH 6/9] Limit scope of variable
|
||||
|
||||
Limit the scope of a variable, by splitting it into several distinct
|
||||
block scope variables.
|
||||
|
||||
This makes some asprintf(3) calls obsolete, and improves readability by
|
||||
splitting the purpose of the variable.
|
||||
|
||||
Upstream-commit: b37fb75f569b3ddde30dd85184ea160f63abb7d5
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 19 ++++++++-----------
|
||||
1 file changed, 8 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index 7d49261..962ac55 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -1529,7 +1529,6 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
struct logState *state, struct logNames *rotNames)
|
||||
{
|
||||
struct tm now;
|
||||
- char *oldName = NULL;
|
||||
const char *compext = "";
|
||||
const char *fileext = "";
|
||||
int hasErrors = 0;
|
||||
@@ -1770,11 +1769,8 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
sortGlobResult(&globResult, strlen(rotNames->dirName) + 1 + strlen(rotNames->baseName), dformat);
|
||||
for (glob_count = 0; glob_count < globResult.gl_pathc && !hasErrors; glob_count++) {
|
||||
struct stat sbprev;
|
||||
+ const char *oldName = globResult.gl_pathv[glob_count];
|
||||
|
||||
- if (asprintf(&oldName, "%s", (globResult.gl_pathv)[glob_count]) < 0) {
|
||||
- message_OOM();
|
||||
- return 1;
|
||||
- }
|
||||
if (stat(oldName, &sbprev)) {
|
||||
if (errno == ENOENT)
|
||||
message(MESS_DEBUG, "previous log %s does not exist\n", oldName);
|
||||
@@ -1783,7 +1779,6 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
} else {
|
||||
hasErrors = compressLogFile(oldName, log, &sbprev);
|
||||
}
|
||||
- free(oldName);
|
||||
}
|
||||
} else {
|
||||
message(MESS_DEBUG,
|
||||
@@ -1793,6 +1788,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
free(glob_pattern);
|
||||
} else {
|
||||
struct stat sbprev;
|
||||
+ char *oldName;
|
||||
if (asprintf(&oldName, "%s/%s.%d%s", rotNames->dirName,
|
||||
rotNames->baseName, logStart, fileext) < 0) {
|
||||
message_OOM();
|
||||
@@ -1853,16 +1849,14 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
}
|
||||
if (mail_out != (size_t)-1) {
|
||||
/* oldName is oldest Backup found (for unlink later) */
|
||||
- if (asprintf(&oldName, "%s", (globResult.gl_pathv)[mail_out]) < 0) {
|
||||
- message_OOM();
|
||||
- return 1;
|
||||
- }
|
||||
+ const char *oldName = globResult.gl_pathv[mail_out];
|
||||
rotNames->disposeName = strdup(oldName);
|
||||
if (rotNames->disposeName == NULL) {
|
||||
message_OOM();
|
||||
+ globfree(&globResult);
|
||||
+ free(glob_pattern);
|
||||
return 1;
|
||||
}
|
||||
- free(oldName);
|
||||
} else {
|
||||
free(rotNames->disposeName);
|
||||
rotNames->disposeName = NULL;
|
||||
@@ -1878,6 +1872,8 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
(log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext) < 0) {
|
||||
message_OOM();
|
||||
rotNames->firstRotated = NULL;
|
||||
+ globfree(&globResult);
|
||||
+ free(glob_pattern);
|
||||
return 1;
|
||||
}
|
||||
globfree(&globResult);
|
||||
@@ -1885,6 +1881,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
} else {
|
||||
int i;
|
||||
char *newName = NULL;
|
||||
+ char *oldName;
|
||||
|
||||
if (rotateCount == -1) {
|
||||
rotateCount = findLastRotated(rotNames, fileext, compext);
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From 1a1eb69e6c4ae403edceb411cb0bbc80473e2527 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 20 Apr 2021 17:41:16 +0200
|
||||
Subject: [PATCH 7/9] Free memory on noolddir configuration
|
||||
|
||||
Consider the following configuration:
|
||||
olddir /var/log/foo
|
||||
noolddir
|
||||
|
||||
Do not leak the memory of the initial olddir path.
|
||||
|
||||
Upstream-commit: 59e8e321d3221a3beaf7b9c99b17d5cb7dbcfaf0
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
config.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/config.c b/config.c
|
||||
index 2905ff7..b7406f5 100644
|
||||
--- a/config.c
|
||||
+++ b/config.c
|
||||
@@ -1134,7 +1134,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
if (newlog->dateformat == NULL)
|
||||
continue;
|
||||
} else if (!strcmp(key, "noolddir")) {
|
||||
- newlog->oldDir = NULL;
|
||||
+ freeLogItem(oldDir);
|
||||
} else if (!strcmp(key, "mailfirst")) {
|
||||
newlog->flags |= LOG_FLAG_MAILFIRST;
|
||||
} else if (!strcmp(key, "maillast")) {
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From 4aabfd0fe19832ba1df8919356d1d2d4b463937d Mon Sep 17 00:00:00 2001
|
||||
From: Kamil Dudka <kdudka@redhat.com>
|
||||
Date: Mon, 3 May 2021 15:14:09 +0200
|
||||
Subject: [PATCH 8/9] readConfigFile: release `globerr_msg` on all code paths
|
||||
|
||||
This eliminates the following reports by Coverity:
|
||||
|
||||
Error: RESOURCE_LEAK (CWE-772):
|
||||
logrotate-3.18.0.18_7a4d/config.c:1798: alloc_arg: "asprintf" allocates memory that is stored into "globerr_msg". [Note: The source code implementation of the function has been overridden by a builtin model.]
|
||||
logrotate-3.18.0.18_7a4d/config.c:2116: leaked_storage: Variable "globerr_msg" going out of scope leaks the storage it points to.
|
||||
|
||||
Error: RESOURCE_LEAK (CWE-772):
|
||||
logrotate-3.18.0.18_7a4d/config.c:1798: alloc_arg: "asprintf" allocates memory that is stored into "globerr_msg". [Note: The source code implementation of the function has been overridden by a builtin model.]
|
||||
logrotate-3.18.0.18_7a4d/config.c:2122: leaked_storage: Variable "globerr_msg" going out of scope leaks the storage it points to.
|
||||
|
||||
Closes: https://github.com/logrotate/logrotate/pull/387
|
||||
|
||||
Upstream-commit: 97f841be2bb52b9ac00cd564a6eb0a853d1017bd
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
config.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/config.c b/config.c
|
||||
index b7406f5..91fd412 100644
|
||||
--- a/config.c
|
||||
+++ b/config.c
|
||||
@@ -2086,12 +2086,14 @@ next_state: ;
|
||||
|
||||
munmap(buf, length);
|
||||
close(fd);
|
||||
+ free(globerr_msg);
|
||||
return logerror;
|
||||
error:
|
||||
/* free is a NULL-safe operation */
|
||||
free(key);
|
||||
munmap(buf, length);
|
||||
close(fd);
|
||||
+ free(globerr_msg);
|
||||
return 1;
|
||||
}
|
||||
|
||||
--
|
||||
2.30.2
|
||||
|
||||
|
||||
From b5610cd1b0bc2cf9ab887007a953fbf6340cb150 Mon Sep 17 00:00:00 2001
|
||||
From: Kamil Dudka <kdudka@redhat.com>
|
||||
Date: Mon, 3 May 2021 15:17:59 +0200
|
||||
Subject: [PATCH 9/9] prerotateSingleLog: release `oldName` on all code paths
|
||||
|
||||
This eliminates the following reports by Coverity:
|
||||
|
||||
Error: RESOURCE_LEAK (CWE-772):
|
||||
logrotate-3.18.0.18_7a4d/logrotate.c:1911: alloc_arg: "asprintf" allocates memory that is stored into "oldName". [Note: The source code implementation of the function has been overridden by a builtin model.]
|
||||
logrotate-3.18.0.18_7a4d/logrotate.c:1919: noescape: Resource "oldName" is not freed or pointed-to in "strdup".
|
||||
logrotate-3.18.0.18_7a4d/logrotate.c:1922: leaked_storage: Variable "oldName" going out of scope leaks the storage it points to.
|
||||
|
||||
Error: RESOURCE_LEAK (CWE-772):
|
||||
logrotate-3.18.0.18_7a4d/logrotate.c:1911: alloc_arg: "asprintf" allocates memory that is stored into "oldName". [Note: The source code implementation of the function has been overridden by a builtin model.]
|
||||
logrotate-3.18.0.18_7a4d/logrotate.c:1919: noescape: Resource "oldName" is not freed or pointed-to in "strdup".
|
||||
logrotate-3.18.0.18_7a4d/logrotate.c:1931: leaked_storage: Variable "oldName" going out of scope leaks the storage it points to.
|
||||
|
||||
Closes: https://github.com/logrotate/logrotate/pull/387
|
||||
|
||||
Upstream-commit: 85bc130b19344a3d9c8b472142df14ddcd0a166d
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index 962ac55..d3f2825 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -1903,6 +1903,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
rotNames->disposeName = strdup(oldName);
|
||||
if (rotNames->disposeName == NULL) {
|
||||
message_OOM();
|
||||
+ free(oldName);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -1911,6 +1912,7 @@ static int prerotateSingleLog(const struct logInfo *log, unsigned logNum,
|
||||
rotNames->baseName, logStart, fileext,
|
||||
(log->flags & LOG_FLAG_DELAYCOMPRESS) ? "" : compext) < 0) {
|
||||
message_OOM();
|
||||
+ free(oldName);
|
||||
rotNames->firstRotated = NULL;
|
||||
return 1;
|
||||
}
|
||||
--
|
||||
2.30.2
|
||||
|
@ -1,62 +0,0 @@
|
||||
From 4810afca1223099c1546da8d73d653c0d1eff96e Mon Sep 17 00:00:00 2001
|
||||
From: Kamil Dudka <kdudka@redhat.com>
|
||||
Date: Tue, 27 Apr 2021 18:36:30 +0200
|
||||
Subject: [PATCH 1/2] logrotate.8: unify documentation of
|
||||
copy/copytruncate/renamecopy
|
||||
|
||||
Bug: https://bugzilla.redhat.com/1934629
|
||||
|
||||
Closes: https://github.com/logrotate/logrotate/pull/386
|
||||
|
||||
Upstream-commit: 6ac9fe5759678b4c2b312eea490ebbae25092213
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.8.in | 18 +++++++++++++-----
|
||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/logrotate.8.in b/logrotate.8.in
|
||||
index f27c279..8064d68 100644
|
||||
--- a/logrotate.8.in
|
||||
+++ b/logrotate.8.in
|
||||
@@ -411,7 +411,8 @@ Make a copy of the log file, but don't change the original at all.
|
||||
This option can be used, for instance, to make a snapshot of the current
|
||||
log file, or when some other utility needs to truncate or parse the file.
|
||||
When this option is used, the \fBcreate\fR option will have no effect,
|
||||
-as the old log file stays in place.
|
||||
+as the old log file stays in place. The \fBcopy\fR option allows storing
|
||||
+rotated log files on the different devices using \fBolddir\fR directive.
|
||||
|
||||
.TP
|
||||
\fBnocopy\fR
|
||||
@@ -427,7 +428,9 @@ and thus might continue writing (appending) to the previous log file forever.
|
||||
Note that there is a very small time slice between copying the file and
|
||||
truncating it, so some logging data might be lost.
|
||||
When this option is used, the \fBcreate\fR option will have no effect,
|
||||
-as the old log file stays in place.
|
||||
+as the old log file stays in place. The \fBcopytruncate\fR option allows
|
||||
+storing rotated log files on the different devices using \fBolddir\fR
|
||||
+directive.
|
||||
|
||||
.TP
|
||||
\fBnocopytruncate\fR
|
||||
@@ -438,9 +441,14 @@ Do not truncate the original log file in place after creating a copy
|
||||
\fBrenamecopy\fR
|
||||
Log file is renamed to temporary filename in the same directory by adding
|
||||
".tmp" extension to it. After that, \fBpostrotate\fR script is run
|
||||
-and log file is copied from temporary filename to final filename. This allows
|
||||
-storing rotated log files on the different devices using \fBolddir\fR
|
||||
-directive. In the end, temporary filename is removed.
|
||||
+and log file is copied from temporary filename to final filename. In the end,
|
||||
+temporary filename is removed. The \fBrenamecopy\fR option allows storing
|
||||
+rotated log files on the different devices using \fBolddir\fR directive.
|
||||
+
|
||||
+.TP
|
||||
+\fBnorenamecopy\fR
|
||||
+Do not rename and copy the original log file
|
||||
+(this overrides the \fBrenamecopy\fR option).
|
||||
|
||||
.TP
|
||||
\fBshred\fR
|
||||
--
|
||||
2.30.2
|
||||
|
@ -1,89 +0,0 @@
|
||||
From 337eb1492f8b694542d704c7a4612e3211f717e5 Mon Sep 17 00:00:00 2001
|
||||
From: Kamil Dudka <kdudka@redhat.com>
|
||||
Date: Tue, 27 Apr 2021 20:52:32 +0200
|
||||
Subject: [PATCH 2/2] make `renamecopy` and `copytruncate` override each other
|
||||
|
||||
These option cannot work together. This rule prevents unnecessary
|
||||
rotation failure in case one of the options comes from the global
|
||||
configuration and the other one from log-specific configuration.
|
||||
|
||||
Bug: https://bugzilla.redhat.com/1934601
|
||||
|
||||
Closes: https://github.com/logrotate/logrotate/pull/386
|
||||
|
||||
Upstream-commit: fe53a0efd21c11dbe9705564f92f5d9aa6bf855e
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
config.c | 2 ++
|
||||
logrotate.8.in | 3 ++-
|
||||
test/test-config.24.in | 3 +++
|
||||
test/test-config.58.in | 3 +++
|
||||
4 files changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/config.c b/config.c
|
||||
index 91fd412..1bca9e4 100644
|
||||
--- a/config.c
|
||||
+++ b/config.c
|
||||
@@ -1106,10 +1106,12 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig)
|
||||
newlog->flags &= ~LOG_FLAG_SHAREDSCRIPTS;
|
||||
} else if (!strcmp(key, "copytruncate")) {
|
||||
newlog->flags |= LOG_FLAG_COPYTRUNCATE;
|
||||
+ newlog->flags &= ~LOG_FLAG_TMPFILENAME;
|
||||
} else if (!strcmp(key, "nocopytruncate")) {
|
||||
newlog->flags &= ~LOG_FLAG_COPYTRUNCATE;
|
||||
} else if (!strcmp(key, "renamecopy")) {
|
||||
newlog->flags |= LOG_FLAG_TMPFILENAME;
|
||||
+ newlog->flags &= ~LOG_FLAG_COPYTRUNCATE;
|
||||
} else if (!strcmp(key, "norenamecopy")) {
|
||||
newlog->flags &= ~LOG_FLAG_TMPFILENAME;
|
||||
} else if (!strcmp(key, "copy")) {
|
||||
diff --git a/logrotate.8.in b/logrotate.8.in
|
||||
index 8064d68..f0aa23f 100644
|
||||
--- a/logrotate.8.in
|
||||
+++ b/logrotate.8.in
|
||||
@@ -430,7 +430,7 @@ truncating it, so some logging data might be lost.
|
||||
When this option is used, the \fBcreate\fR option will have no effect,
|
||||
as the old log file stays in place. The \fBcopytruncate\fR option allows
|
||||
storing rotated log files on the different devices using \fBolddir\fR
|
||||
-directive.
|
||||
+directive. The \fBcopytruncate\fR option implies \fBnorenamecopy\fR.
|
||||
|
||||
.TP
|
||||
\fBnocopytruncate\fR
|
||||
@@ -444,6 +444,7 @@ Log file is renamed to temporary filename in the same directory by adding
|
||||
and log file is copied from temporary filename to final filename. In the end,
|
||||
temporary filename is removed. The \fBrenamecopy\fR option allows storing
|
||||
rotated log files on the different devices using \fBolddir\fR directive.
|
||||
+The \fBrenamecopy\fR option implies \fBnocopytruncate\fR.
|
||||
|
||||
.TP
|
||||
\fBnorenamecopy\fR
|
||||
diff --git a/test/test-config.24.in b/test/test-config.24.in
|
||||
index 35cfcd3..7a2a760 100644
|
||||
--- a/test/test-config.24.in
|
||||
+++ b/test/test-config.24.in
|
||||
@@ -1,5 +1,8 @@
|
||||
create
|
||||
|
||||
+# will be overridden by copytruncate
|
||||
+renamecopy
|
||||
+
|
||||
&DIR&/test*.log {
|
||||
daily
|
||||
copytruncate
|
||||
diff --git a/test/test-config.58.in b/test/test-config.58.in
|
||||
index 34906da..79058be 100644
|
||||
--- a/test/test-config.58.in
|
||||
+++ b/test/test-config.58.in
|
||||
@@ -1,5 +1,8 @@
|
||||
create
|
||||
|
||||
+# will be overridden by renamecopy
|
||||
+copytruncate
|
||||
+
|
||||
&DIR&/test.log {
|
||||
renamecopy
|
||||
weekly
|
||||
--
|
||||
2.30.2
|
||||
|
@ -1,253 +0,0 @@
|
||||
From 53e0dc4a8ddcb169b0ba36472de03f4366f45159 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 29 Mar 2022 21:06:54 +0200
|
||||
Subject: [PATCH 1/3] skip locking if state file is world-readable
|
||||
|
||||
Fixes: CVE-2022-1348 - potential DoS from unprivileged users via the state file
|
||||
Bug: https://bugzilla.redhat.com/CVE-2022-1348
|
||||
|
||||
Upstream-commit: 1f76a381e2caa0603ae3dbc51ed0f1aa0d6658b9
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 24 ++++++++++++++++++++++--
|
||||
logrotate.spec.in | 3 +--
|
||||
test/Makefile.am | 1 +
|
||||
test/test-0087.sh | 1 +
|
||||
test/test-0092.sh | 19 +++++++++++++++++++
|
||||
test/test-config.92.in | 4 ++++
|
||||
6 files changed, 48 insertions(+), 4 deletions(-)
|
||||
create mode 100755 test/test-0092.sh
|
||||
create mode 100644 test/test-config.92.in
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index d3f2825..78153b3 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -2565,6 +2565,9 @@ static int writeState(const char *stateFilename)
|
||||
|
||||
close(fdcurr);
|
||||
|
||||
+ /* drop world-readable flag to prevent others from locking */
|
||||
+ sb.st_mode &= ~(mode_t)S_IROTH;
|
||||
+
|
||||
fdsave = createOutputFile(tmpFilename, O_RDWR | O_CREAT | O_TRUNC, &sb, prev_acl, 0);
|
||||
#ifdef WITH_ACL
|
||||
if (prev_acl) {
|
||||
@@ -2898,15 +2901,16 @@ static int readState(const char *stateFilename)
|
||||
|
||||
static int lockState(const char *stateFilename, int skip_state_lock)
|
||||
{
|
||||
+ struct stat sb;
|
||||
int lockFd = open(stateFilename, O_RDWR | O_CLOEXEC);
|
||||
if (lockFd == -1) {
|
||||
if (errno == ENOENT) {
|
||||
message(MESS_DEBUG, "Creating stub state file: %s\n",
|
||||
stateFilename);
|
||||
|
||||
- /* create a stub state file with mode 0644 */
|
||||
+ /* create a stub state file with mode 0640 */
|
||||
lockFd = open(stateFilename, O_CREAT | O_EXCL | O_WRONLY,
|
||||
- S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
|
||||
+ S_IWUSR | S_IRUSR | S_IRGRP);
|
||||
if (lockFd == -1) {
|
||||
message(MESS_ERROR, "error creating stub state file %s: %s\n",
|
||||
stateFilename, strerror(errno));
|
||||
@@ -2926,6 +2930,22 @@ static int lockState(const char *stateFilename, int skip_state_lock)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ if (fstat(lockFd, &sb) == -1) {
|
||||
+ message(MESS_ERROR, "error stat()ing state file %s: %s\n",
|
||||
+ stateFilename, strerror(errno));
|
||||
+ close(lockFd);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ if (sb.st_mode & S_IROTH) {
|
||||
+ message(MESS_ERROR, "state file %s is world-readable and thus can"
|
||||
+ " be locked from other unprivileged users."
|
||||
+ " Skipping lock acquisition...\n",
|
||||
+ stateFilename);
|
||||
+ close(lockFd);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
if (flock(lockFd, LOCK_EX | LOCK_NB) == -1) {
|
||||
if (errno == EWOULDBLOCK) {
|
||||
message(MESS_ERROR, "state file %s is already locked\n"
|
||||
diff --git a/logrotate.spec.in b/logrotate.spec.in
|
||||
index 92e1d97..3caabf2 100644
|
||||
--- a/logrotate.spec.in
|
||||
+++ b/logrotate.spec.in
|
||||
@@ -41,7 +41,6 @@ install -p -m 644 examples/logrotate.conf $RPM_BUILD_ROOT%{_sysconfdir}/logrotat
|
||||
install -p -m 644 examples/btmp $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/btmp
|
||||
install -p -m 644 examples/wtmp $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/wtmp
|
||||
install -p -m 755 examples/logrotate.cron $RPM_BUILD_ROOT%{_sysconfdir}/cron.daily/logrotate
|
||||
-touch $RPM_BUILD_ROOT%{_localstatedir}/lib/logrotate.status
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
@@ -55,4 +54,4 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%attr(0755, root, root) %{_sysconfdir}/cron.daily/logrotate
|
||||
%attr(0644, root, root) %config(noreplace) %{_sysconfdir}/logrotate.conf
|
||||
%attr(0755, root, root) %{_sysconfdir}/logrotate.d
|
||||
-%attr(0644, root, root) %verify(not size md5 mtime) %config(noreplace) %{_localstatedir}/lib/logrotate.status
|
||||
+%ghost %attr(0640, root, root) %verify(not size md5 mtime) %{_localstatedir}/lib/logrotate.status
|
||||
diff --git a/test/Makefile.am b/test/Makefile.am
|
||||
index 914fe65..d6fb7c8 100644
|
||||
--- a/test/Makefile.am
|
||||
+++ b/test/Makefile.am
|
||||
@@ -87,6 +87,7 @@ TEST_CASES = \
|
||||
test-0086.sh \
|
||||
test-0087.sh \
|
||||
test-0088.sh \
|
||||
+ test-0092.sh \
|
||||
test-0100.sh \
|
||||
test-0101.sh
|
||||
|
||||
diff --git a/test/test-0087.sh b/test/test-0087.sh
|
||||
index 91e5266..aeff2c6 100755
|
||||
--- a/test/test-0087.sh
|
||||
+++ b/test/test-0087.sh
|
||||
@@ -8,6 +8,7 @@ cleanup 87
|
||||
preptest test.log 87 1
|
||||
|
||||
touch state
|
||||
+chmod 0640 state
|
||||
|
||||
$RLR test-config.87 -f &
|
||||
|
||||
diff --git a/test/test-0092.sh b/test/test-0092.sh
|
||||
new file mode 100755
|
||||
index 0000000..be52e14
|
||||
--- /dev/null
|
||||
+++ b/test/test-0092.sh
|
||||
@@ -0,0 +1,19 @@
|
||||
+#!/bin/sh
|
||||
+
|
||||
+. ./test-common.sh
|
||||
+
|
||||
+# check state file locking
|
||||
+cleanup 92
|
||||
+
|
||||
+preptest test.log 92 1
|
||||
+
|
||||
+touch state
|
||||
+chmod 0644 state
|
||||
+flock state -c "sleep 10" &
|
||||
+
|
||||
+$RLR -f test-config.92 || exit 23
|
||||
+
|
||||
+checkoutput <<EOF
|
||||
+test.log 0
|
||||
+test.log.1 0 zero
|
||||
+EOF
|
||||
diff --git a/test/test-config.92.in b/test/test-config.92.in
|
||||
new file mode 100644
|
||||
index 0000000..ac93900
|
||||
--- /dev/null
|
||||
+++ b/test/test-config.92.in
|
||||
@@ -0,0 +1,4 @@
|
||||
+&DIR&/test.log {
|
||||
+ rotate 1
|
||||
+ create
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
||||
From 0d2d770cc5aa7bf14e84a2832249eeeb391b0b8a Mon Sep 17 00:00:00 2001
|
||||
From: Kamil Dudka <kdudka@redhat.com>
|
||||
Date: Wed, 25 May 2022 09:55:02 +0200
|
||||
Subject: [PATCH 2/3] drop world-readable permission on state file
|
||||
|
||||
... even when ACLs are enabled. This is a follow-up to the fix
|
||||
of CVE-2022-1348. It has no impact on security but makes the state
|
||||
file locking work again in more cases.
|
||||
|
||||
Closes: https://github.com/logrotate/logrotate/pull/446
|
||||
|
||||
Upstream-commit: addbd293242b0b78aa54f054e6c1d249451f137d
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 10 +++++++---
|
||||
test/test-0048.sh | 1 +
|
||||
2 files changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index 78153b3..8d49f26 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -2498,6 +2498,7 @@ static int writeState(const char *stateFilename)
|
||||
struct tm now;
|
||||
time_t now_time, last_time;
|
||||
char *prevCtx;
|
||||
+ int force_mode = 0;
|
||||
|
||||
localtime_r(&nowSecs, &now);
|
||||
|
||||
@@ -2565,10 +2566,13 @@ static int writeState(const char *stateFilename)
|
||||
|
||||
close(fdcurr);
|
||||
|
||||
- /* drop world-readable flag to prevent others from locking */
|
||||
- sb.st_mode &= ~(mode_t)S_IROTH;
|
||||
+ if (sb.st_mode & (mode_t)S_IROTH) {
|
||||
+ /* drop world-readable flag to prevent others from locking */
|
||||
+ sb.st_mode &= ~(mode_t)S_IROTH;
|
||||
+ force_mode = 1;
|
||||
+ }
|
||||
|
||||
- fdsave = createOutputFile(tmpFilename, O_RDWR | O_CREAT | O_TRUNC, &sb, prev_acl, 0);
|
||||
+ fdsave = createOutputFile(tmpFilename, O_RDWR | O_CREAT | O_TRUNC, &sb, prev_acl, force_mode);
|
||||
#ifdef WITH_ACL
|
||||
if (prev_acl) {
|
||||
acl_free(prev_acl);
|
||||
diff --git a/test/test-0048.sh b/test/test-0048.sh
|
||||
index 62d606b..06b255a 100755
|
||||
--- a/test/test-0048.sh
|
||||
+++ b/test/test-0048.sh
|
||||
@@ -18,6 +18,7 @@ cat > state << EOF
|
||||
logrotate state -- version 2
|
||||
EOF
|
||||
|
||||
+chmod 0640 state
|
||||
setfacl -m u:nobody:rwx state
|
||||
|
||||
$RLR test-config.48
|
||||
--
|
||||
2.35.3
|
||||
|
||||
|
||||
From 105ed9f433a3aaf1aec93318aa9c8811b59d7b23 Mon Sep 17 00:00:00 2001
|
||||
From: Kamil Dudka <kdudka@redhat.com>
|
||||
Date: Fri, 27 May 2022 09:56:07 +0200
|
||||
Subject: [PATCH 3/3] lockState: do not print `error:` when exit code is
|
||||
unaffected
|
||||
|
||||
Closes: https://github.com/logrotate/logrotate/pull/448
|
||||
|
||||
Upstream-commit: 31cf1099ab8514dfcae5a980bc77352edd5292f8
|
||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
||||
---
|
||||
logrotate.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/logrotate.c b/logrotate.c
|
||||
index 27deaf3..77db8c2 100644
|
||||
--- a/logrotate.c
|
||||
+++ b/logrotate.c
|
||||
@@ -2942,8 +2942,8 @@ static int lockState(const char *stateFilename, int skip_state_lock)
|
||||
}
|
||||
|
||||
if (sb.st_mode & S_IROTH) {
|
||||
- message(MESS_ERROR, "state file %s is world-readable and thus can"
|
||||
- " be locked from other unprivileged users."
|
||||
+ message(MESS_NORMAL, "warning: state file %s is world-readable"
|
||||
+ " and thus can be locked from other unprivileged users."
|
||||
" Skipping lock acquisition...\n",
|
||||
stateFilename);
|
||||
close(lockFd);
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,179 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: SKS 1.1.6
|
||||
Comment: Hostname: pgp.mit.edu
|
||||
|
||||
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
|
||||
=JFa+
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
@ -0,0 +1,16 @@
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAABCgAdFiEEjszfEhAK2E2i7n6/x4znN6PD4o4FAmZbQTIACgkQx4znN6PD
|
||||
4o73dRAAks06NHExbdj4Ih4NvQ0TXzm6cPXBEjq+gv3bc/HpHKsgcUmmrXwA7bU2
|
||||
S78FmycscJ5F0yvqtVBySmThIdoNU2b03rNtXWT6a3PjUKjQq8oPGB7dsxFhwQDn
|
||||
dczL5FR1sOQ4tLcLlCx7gud6tegF6iA8YESNWZlJPx9gK1NgvEgdqK7iCR2UFp24
|
||||
X/u1bztBd6xN3Tequor5ttMJlsU2vrbSHB4aX0r16yd4nAakihVs0p8hNSPb1/b+
|
||||
zw/Uy0sLBMID7Fid9VYaAX5m8C9XhVUzqUM+06cCgIRvicC7x34pmC8a8WkVSQtB
|
||||
IxpDHO4ZPdHMG5LEuLXY1pObzWaN6J5fhIXwsEkmydYdzuOTDAaWGjGvG9F00Bwu
|
||||
1B4Oq0KBt5xNyFCLkVwHxBJUgMRG+avZudT6uJrbmmpRgYLcVA60D/MDWtk0YpUd
|
||||
S7soYLyg3tAgmpru0bhB6IaSIvhf0PVX8Gf7j9mMSAlr6q7cjJTF03RPZcQ/SCYr
|
||||
2wwN/aoCquN+yn6chC91yKdkJIaDD10maNtp5UU+OKgaIGvGr+xNreHm2W/zblSv
|
||||
h1Oh3dPLzggiLo3s0mMMC19jadGv0lyNwV9QiWuaslzw8B/gRH+3BkGgg0sydS1f
|
||||
LVWtjHLd2ygIojBx5Ubi0rYX206OlWtgB9zZbFsIJCfLGCS/2W0=
|
||||
=K4ql
|
||||
-----END PGP SIGNATURE-----
|
Loading…
Reference in new issue