commit b4e5e6b6f06fbdcc85a28bb8c98f250e7eb68922 Author: CentOS Sources Date: Tue May 7 02:37:04 2019 -0400 import logrotate-3.14.0-3.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c2ebbe --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/logrotate-3.14.0.tar.xz diff --git a/.logrotate.metadata b/.logrotate.metadata new file mode 100644 index 0000000..e406f00 --- /dev/null +++ b/.logrotate.metadata @@ -0,0 +1 @@ +10416a3aaea4fbf6c1a01858f2fb994e132c4127 SOURCES/logrotate-3.14.0.tar.xz diff --git a/SOURCES/0001-logrotate-3.14.0-man-version.patch b/SOURCES/0001-logrotate-3.14.0-man-version.patch new file mode 100644 index 0000000..726ed2a --- /dev/null +++ b/SOURCES/0001-logrotate-3.14.0-man-version.patch @@ -0,0 +1,34 @@ +From b0d067cfba64956893fc095bb37f8c767f5a910e Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Mon, 6 Aug 2018 17:13:31 +0200 +Subject: [PATCH] logrotate.8: document the --version option + +The man page now covers all the options that are listed +by `logrotate --help`. + +Bug: https://bugzilla.redhat.com/1611498 + +Upstream-commit: 4088ef987df2ec48cc3d968eb87ad27c840fa2d8 +Signed-off-by: Kamil Dudka +--- + logrotate.8.in | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/logrotate.8.in b/logrotate.8.in +index 004229e..5ef09c5 100644 +--- a/logrotate.8.in ++++ b/logrotate.8.in +@@ -87,6 +87,10 @@ Prints a short usage message. + \fB\-v\fR, \fB\-\-verbose\fR + Turns on verbose mode, for example to display messages during rotation. + ++.TP ++\fB\-\-version\fR ++Display version information. ++ + .SH CONFIGURATION FILE + + \fBlogrotate\fR reads everything about the log files it should be handling +-- +2.17.1 + diff --git a/SOURCES/0002-logrotate-3.14.0-coverity.patch b/SOURCES/0002-logrotate-3.14.0-coverity.patch new file mode 100644 index 0000000..80d76c3 --- /dev/null +++ b/SOURCES/0002-logrotate-3.14.0-coverity.patch @@ -0,0 +1,630 @@ +From a4ac21e9a8cfe8a73471a195308a742e07d7fe8d Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Wed, 1 Aug 2018 15:32:38 +0200 +Subject: [PATCH 1/3] readConfigFile: assign and check 'key' separately + +... to make the code readable. No changes in behavior intended +by this commit. +--- + config.c | 312 +++++++++++++++++++++++++++---------------------------- + 1 file changed, 152 insertions(+), 160 deletions(-) + +diff --git a/config.c b/config.c +index 84db36f..d2fba10 100644 +--- a/config.c ++++ b/config.c +@@ -1037,7 +1037,8 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + } + + if (isalpha((unsigned char)*start)) { +- if ((key = isolateWord(&start, &buf, length)) == NULL) ++ key = isolateWord(&start, &buf, length); ++ if (key == NULL) + continue; + if (!strcmp(key, "compress")) { + newlog->flags |= LOG_FLAG_COMPRESS; +@@ -1191,16 +1192,16 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + } + } else if (!strcmp(key, "shredcycles")) { + free(key); +- if ((key = isolateValue(configFile, lineNum, "shred cycles", +- &start, &buf, length)) != NULL) { +- newlog->shred_cycles = strtoul(key, &chptr, 0); +- if (*chptr || newlog->shred_cycles < 0) { +- message(MESS_ERROR, "%s:%d bad shred cycles '%s'\n", +- configFile, lineNum, key); +- goto error; +- } ++ key = isolateValue(configFile, lineNum, "shred cycles", ++ &start, &buf, length); ++ if (key == NULL) ++ continue; ++ newlog->shred_cycles = strtoul(key, &chptr, 0); ++ if (*chptr || newlog->shred_cycles < 0) { ++ message(MESS_ERROR, "%s:%d bad shred cycles '%s'\n", ++ configFile, lineNum, key); ++ goto error; + } +- else continue; + } else if (!strcmp(key, "hourly")) { + newlog->criterium = ROT_HOURLY; + } else if (!strcmp(key, "daily")) { +@@ -1232,59 +1233,53 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + newlog->criterium = ROT_YEARLY; + } else if (!strcmp(key, "rotate")) { + free(key); +- if ((key = isolateValue +- (configFile, lineNum, "rotate count", &start, +- &buf, length)) != NULL) { +- +- newlog->rotateCount = strtoul(key, &chptr, 0); +- if (*chptr || newlog->rotateCount < 0) { +- message(MESS_ERROR, +- "%s:%d bad rotation count '%s'\n", +- configFile, lineNum, key); +- RAISE_ERROR(); +- } ++ key = isolateValue(configFile, lineNum, "rotate count", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ newlog->rotateCount = strtoul(key, &chptr, 0); ++ if (*chptr || newlog->rotateCount < 0) { ++ message(MESS_ERROR, ++ "%s:%d bad rotation count '%s'\n", ++ configFile, lineNum, key); ++ RAISE_ERROR(); + } +- else continue; + } else if (!strcmp(key, "start")) { + free(key); +- if ((key = isolateValue +- (configFile, lineNum, "start count", &start, +- &buf, length)) != NULL) { +- +- newlog->logStart = strtoul(key, &chptr, 0); +- if (*chptr || newlog->logStart < 0) { +- message(MESS_ERROR, "%s:%d bad start count '%s'\n", +- configFile, lineNum, key); +- RAISE_ERROR(); +- } ++ key = isolateValue(configFile, lineNum, "start count", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ newlog->logStart = strtoul(key, &chptr, 0); ++ if (*chptr || newlog->logStart < 0) { ++ message(MESS_ERROR, "%s:%d bad start count '%s'\n", ++ configFile, lineNum, key); ++ RAISE_ERROR(); + } +- else continue; + } else if (!strcmp(key, "minage")) { + free(key); +- if ((key = isolateValue +- (configFile, lineNum, "minage count", &start, +- &buf, length)) != NULL) { +- newlog->rotateMinAge = strtoul(key, &chptr, 0); +- if (*chptr || newlog->rotateMinAge < 0) { +- message(MESS_ERROR, "%s:%d bad minimum age '%s'\n", +- configFile, lineNum, start); +- RAISE_ERROR(); +- } ++ key = isolateValue(configFile, lineNum, "minage count", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ newlog->rotateMinAge = strtoul(key, &chptr, 0); ++ if (*chptr || newlog->rotateMinAge < 0) { ++ message(MESS_ERROR, "%s:%d bad minimum age '%s'\n", ++ configFile, lineNum, start); ++ RAISE_ERROR(); + } +- else continue; + } else if (!strcmp(key, "maxage")) { + free(key); +- if ((key = isolateValue +- (configFile, lineNum, "maxage count", &start, +- &buf, length)) != NULL) { +- newlog->rotateAge = strtoul(key, &chptr, 0); +- if (*chptr || newlog->rotateAge < 0) { +- message(MESS_ERROR, "%s:%d bad maximum age '%s'\n", +- configFile, lineNum, start); +- RAISE_ERROR(); +- } ++ key = isolateValue(configFile, lineNum, "maxage count", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ newlog->rotateAge = strtoul(key, &chptr, 0); ++ if (*chptr || newlog->rotateAge < 0) { ++ message(MESS_ERROR, "%s:%d bad maximum age '%s'\n", ++ configFile, lineNum, start); ++ RAISE_ERROR(); + } +- else continue; + } else if (!strcmp(key, "errors")) { + message(MESS_DEBUG, + "%s: %d: the errors directive is deprecated and no longer used.\n", +@@ -1337,48 +1332,48 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + continue; + } + free(key); +- if ((key = isolateValue(configFile, lineNum, "tabooext", &start, +- &buf, length)) != NULL) { +- endtag = key; +- if (*endtag == '+') { ++ key = isolateValue(configFile, lineNum, "tabooext", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ endtag = key; ++ if (*endtag == '+') { ++ endtag++; ++ while (isspace((unsigned char)*endtag) && *endtag) + endtag++; +- while (isspace((unsigned char)*endtag) && *endtag) +- endtag++; +- } else { +- free_2d_array(tabooPatterns, tabooCount); +- tabooCount = 0; +- /* realloc of NULL is safe by definition */ +- tabooPatterns = NULL; +- } +- +- while (*endtag) { +- int bytes; +- char *pattern = NULL; ++ } else { ++ free_2d_array(tabooPatterns, tabooCount); ++ tabooCount = 0; ++ /* realloc of NULL is safe by definition */ ++ tabooPatterns = NULL; ++ } + +- chptr = endtag; +- while (!isspace((unsigned char)*chptr) && *chptr != ',' && *chptr) +- chptr++; ++ while (*endtag) { ++ int bytes; ++ char *pattern = NULL; + +- /* accept only non-empty patterns to avoid exclusion of everything */ +- if (endtag < chptr) { +- tabooPatterns = realloc(tabooPatterns, sizeof(*tabooPatterns) * +- (tabooCount + 1)); +- bytes = asprintf(&pattern, "*%.*s", (int)(chptr - endtag), endtag); ++ chptr = endtag; ++ while (!isspace((unsigned char)*chptr) && *chptr != ',' && *chptr) ++ chptr++; + +- /* should test for malloc() failure */ +- assert(bytes != -1); +- tabooPatterns[tabooCount] = pattern; +- tabooCount++; +- } ++ /* accept only non-empty patterns to avoid exclusion of everything */ ++ if (endtag < chptr) { ++ tabooPatterns = realloc(tabooPatterns, sizeof(*tabooPatterns) * ++ (tabooCount + 1)); ++ bytes = asprintf(&pattern, "*%.*s", (int)(chptr - endtag), endtag); + +- endtag = chptr; +- if (*endtag == ',') +- endtag++; +- while (*endtag && isspace((unsigned char)*endtag)) +- endtag++; ++ /* should test for malloc() failure */ ++ assert(bytes != -1); ++ tabooPatterns[tabooCount] = pattern; ++ tabooCount++; + } ++ ++ endtag = chptr; ++ if (*endtag == ',') ++ endtag++; ++ while (*endtag && isspace((unsigned char)*endtag)) ++ endtag++; + } +- else continue; + } else if (!strcmp(key, "taboopat")) { + if (newlog != defConfig) { + message(MESS_ERROR, +@@ -1389,68 +1384,68 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + continue; + } + free(key); +- if ((key = isolateValue(configFile, lineNum, "taboopat", &start, +- &buf, length)) != NULL) { +- endtag = key; +- if (*endtag == '+') { ++ key = isolateValue(configFile, lineNum, "taboopat", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ ++ endtag = key; ++ if (*endtag == '+') { ++ endtag++; ++ while (isspace((unsigned char)*endtag) && *endtag) + endtag++; +- while (isspace((unsigned char)*endtag) && *endtag) +- endtag++; +- } else { +- free_2d_array(tabooPatterns, tabooCount); +- tabooCount = 0; +- /* realloc of NULL is safe by definition */ +- tabooPatterns = NULL; +- } ++ } else { ++ free_2d_array(tabooPatterns, tabooCount); ++ tabooCount = 0; ++ /* realloc of NULL is safe by definition */ ++ tabooPatterns = NULL; ++ } + +- while (*endtag) { +- int bytes; +- char *pattern = NULL; ++ while (*endtag) { ++ int bytes; ++ char *pattern = NULL; + +- chptr = endtag; +- while (!isspace((unsigned char)*chptr) && *chptr != ',' && *chptr) +- chptr++; ++ chptr = endtag; ++ while (!isspace((unsigned char)*chptr) && *chptr != ',' && *chptr) ++ chptr++; + +- tabooPatterns = realloc(tabooPatterns, sizeof(*tabooPatterns) * +- (tabooCount + 1)); +- bytes = asprintf(&pattern, "%.*s", (int)(chptr - endtag), endtag); ++ tabooPatterns = realloc(tabooPatterns, sizeof(*tabooPatterns) * ++ (tabooCount + 1)); ++ bytes = asprintf(&pattern, "%.*s", (int)(chptr - endtag), endtag); + +- /* should test for malloc() failure */ +- assert(bytes != -1); +- tabooPatterns[tabooCount] = pattern; +- tabooCount++; ++ /* should test for malloc() failure */ ++ assert(bytes != -1); ++ tabooPatterns[tabooCount] = pattern; ++ tabooCount++; + +- endtag = chptr; +- if (*endtag == ',') +- endtag++; +- while (*endtag && isspace((unsigned char)*endtag)) +- endtag++; +- } ++ endtag = chptr; ++ if (*endtag == ',') ++ endtag++; ++ while (*endtag && isspace((unsigned char)*endtag)) ++ endtag++; + } +- else continue; + } else if (!strcmp(key, "include")) { + free(key); +- if ((key = isolateValue(configFile, lineNum, "include", &start, +- &buf, length)) != NULL) { +- +- message(MESS_DEBUG, "including %s\n", key); +- if (recursion_depth >= MAX_NESTING) { +- message(MESS_ERROR, "%s:%d include nesting too deep\n", +- configFile, lineNum); +- logerror = 1; +- continue; +- } ++ key = isolateValue(configFile, lineNum, "include", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ message(MESS_DEBUG, "including %s\n", key); ++ if (recursion_depth >= MAX_NESTING) { ++ message(MESS_ERROR, "%s:%d include nesting too deep\n", ++ configFile, lineNum); ++ logerror = 1; ++ continue; ++ } + +- ++recursion_depth; +- rv = readConfigPath(key, newlog); +- --recursion_depth; ++ ++recursion_depth; ++ rv = readConfigPath(key, newlog); ++ --recursion_depth; + +- if (rv) { +- logerror = 1; +- continue; +- } ++ if (rv) { ++ logerror = 1; ++ continue; + } +- else continue; + } else if (!strcmp(key, "olddir")) { + freeLogItem (oldDir); + +@@ -1460,28 +1455,23 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + } + message(MESS_DEBUG, "olddir is now %s\n", newlog->oldDir); + } else if (!strcmp(key, "extension")) { +- if ((key = isolateValue +- (configFile, lineNum, "extension name", &start, +- &buf, length)) != NULL) { +- freeLogItem (extension); +- newlog->extension = key; +- key = NULL; +- } +- else continue; +- +- message(MESS_DEBUG, "extension is now %s\n", +- newlog->extension); ++ key = isolateValue(configFile, lineNum, "extension name", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ freeLogItem (extension); ++ newlog->extension = key; ++ key = NULL; ++ message(MESS_DEBUG, "extension is now %s\n", newlog->extension); + + } else if (!strcmp(key, "addextension")) { +- if ((key = isolateValue +- (configFile, lineNum, "addextension name", &start, +- &buf, length)) != NULL) { +- freeLogItem (addextension); +- newlog->addextension = key; +- key = NULL; +- } +- else continue; +- ++ key = isolateValue(configFile, lineNum, "addextension name", &start, ++ &buf, length); ++ if (key == NULL) ++ continue; ++ freeLogItem (addextension); ++ newlog->addextension = key; ++ key = NULL; + message(MESS_DEBUG, "addextension is now %s\n", + newlog->addextension); + +@@ -1827,7 +1817,8 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + break; + case STATE_LOAD_SCRIPT: + case STATE_LOAD_SCRIPT | STATE_SKIP_CONFIG: +- if ((key = isolateWord(&start, &buf, length)) == NULL) ++ key = isolateWord(&start, &buf, length); ++ if (key == NULL) + continue; + + if (strcmp(key, "endscript") == 0) { +@@ -1862,7 +1853,8 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + newlog = defConfig; + } + else { +- if ((key = isolateWord(&start, &buf, length)) == NULL) ++ key = isolateWord(&start, &buf, length); ++ if (key == NULL) + continue; + if ( + (strcmp(key, "postrotate") == 0) || +-- +2.17.1 + + +From a3a955494999bd4861f14b846c345cbc96715262 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Wed, 1 Aug 2018 15:09:40 +0200 +Subject: [PATCH 2/3] readConfigFile: assign and free 'key' consistently + +This commit fixes the following memory leaks (detected by Coverity): + +Error: RESOURCE_LEAK: +config.c:1466: overwrite_var: Overwriting "key" in "key = isolateValue(configFile, lineNum, "extension name", &start, &buf, length)" leaks the storage that "key" points to. + +Error: RESOURCE_LEAK: +config.c:1479: overwrite_var: Overwriting "key" in "key = isolateValue(configFile, lineNum, "addextension name", &start, &buf, length)" leaks the storage that "key" points to. + +Error: RESOURCE_LEAK: +config.c:1043: alloc_fn: Storage is returned from allocation function "isolateWord". +config.c:219:2: alloc_fn: Storage is returned from allocation function "strndup". +config.c:219:2: assign: Assigning: "key" = "strndup(start, endtag - start)". +config.c:221:2: return_alloc: Returning allocated memory "key". +config.c:1043: var_assign: Assigning: "key" = storage returned from "isolateWord(&start, &buf, length)". +config.c:1928: leaked_storage: Variable "key" going out of scope leaks the storage it points to. + +Error: RESOURCE_LEAK: +config.c:1153: alloc_fn: Storage is returned from allocation function "isolateValue". +config.c:204:2: alloc_fn: Storage is returned from allocation function "isolateLine". +config.c:178:2: alloc_fn: Storage is returned from allocation function "strndup". +config.c:178:2: assign: Assigning: "key" = "strndup(start, endtag - start + 1L)". +config.c:180:2: return_alloc: Returning allocated memory "key". +config.c:204:2: return_alloc_fn: Directly returning storage allocated by "isolateLine". +config.c:1153: var_assign: Assigning: "key" = storage returned from "isolateValue(configFile, lineNum, opt, &start, &buf, length)". +config.c:1928: leaked_storage: Variable "key" going out of scope leaks the storage it points to. + +Error: RESOURCE_LEAK: +config.c:1219: alloc_fn: Storage is returned from allocation function "isolateLine". +config.c:178:2: alloc_fn: Storage is returned from allocation function "strndup". +config.c:178:2: assign: Assigning: "key" = "strndup(start, endtag - start + 1L)". +config.c:180:2: return_alloc: Returning allocated memory "key". +config.c:1219: var_assign: Assigning: "key" = storage returned from "isolateLine(&start, &buf, length)". +config.c:1928: leaked_storage: Variable "key" going out of scope leaks the storage it points to. + +Closes #208 +--- + config.c | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +diff --git a/config.c b/config.c +index d2fba10..39c9bc7 100644 +--- a/config.c ++++ b/config.c +@@ -1022,10 +1022,6 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + + start = buf; + for (start = buf; start - buf < length; start++) { +- if (key) { +- free(key); +- key = NULL; +- } + switch (state) { + case STATE_DEFAULT: + if (isblank((unsigned char)*start)) +@@ -1037,6 +1033,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + } + + if (isalpha((unsigned char)*start)) { ++ free(key); + key = isolateWord(&start, &buf, length); + if (key == NULL) + continue; +@@ -1455,6 +1452,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + } + message(MESS_DEBUG, "olddir is now %s\n", newlog->oldDir); + } else if (!strcmp(key, "extension")) { ++ free(key); + key = isolateValue(configFile, lineNum, "extension name", &start, + &buf, length); + if (key == NULL) +@@ -1465,6 +1463,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + message(MESS_DEBUG, "extension is now %s\n", newlog->extension); + + } else if (!strcmp(key, "addextension")) { ++ free(key); + key = isolateValue(configFile, lineNum, "addextension name", &start, + &buf, length); + if (key == NULL) +@@ -1557,8 +1556,6 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + if (*start != '\n') + state = STATE_SKIP_LINE; + } +- free(key); +- key = NULL; + } else if (*start == '/' || *start == '"' || *start == '\'' + #ifdef GLOB_TILDE + || *start == '~' +@@ -1817,6 +1814,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + break; + case STATE_LOAD_SCRIPT: + case STATE_LOAD_SCRIPT | STATE_SKIP_CONFIG: ++ free(key); + key = isolateWord(&start, &buf, length); + if (key == NULL) + continue; +@@ -1853,6 +1851,7 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + newlog = defConfig; + } + else { ++ free(key); + key = isolateWord(&start, &buf, length); + if (key == NULL) + continue; +@@ -1884,8 +1883,6 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + state = STATE_SKIP_LINE | STATE_SKIP_CONFIG; + } + } +- free(key); +- key = NULL; + } + break; + default: +@@ -1893,10 +1890,6 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + "%s: %d: readConfigFile() unknown state\n", + configFile, lineNum); + } +- if (key) { +- free(key); +- key = NULL; +- } + if (*start == '\n') { + lineNum++; + } +@@ -1910,6 +1903,8 @@ static int readConfigFile(const char *configFile, struct logInfo *defConfig) + goto error; + } + ++ free(key); ++ + munmap(buf, (size_t) length); + close(fd); + return logerror; +-- +2.17.1 + + +From 771af94fd6c6299a7cb3d20c8b247591775653d3 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Wed, 1 Aug 2018 16:06:27 +0200 +Subject: [PATCH 3/3] simplify code of prerotateSingleLog() + +... to eliminate a use-after-free false positive reported by Coverity: + +Error: USE_AFTER_FREE: +logrotate.c:1800: freed_arg: "free" frees "oldName". +logrotate.c:1779: use_after_free: Using freed pointer "oldName". + +Closes #209 +--- + logrotate.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/logrotate.c b/logrotate.c +index 02d45e9..95fd70b 100644 +--- a/logrotate.c ++++ b/logrotate.c +@@ -1353,7 +1353,7 @@ static int prerotateSingleLog(struct logInfo *log, int logNum, + struct logState *state, struct logNames *rotNames) + { + struct tm now = *localtime(&nowSecs); +- char *oldName, *newName = NULL; ++ char *oldName = NULL; + const char *compext = ""; + const char *fileext = ""; + int hasErrors = 0; +@@ -1670,6 +1670,7 @@ static int prerotateSingleLog(struct logInfo *log, int logNum, + free(glob_pattern); + } else { + int i; ++ char *newName = NULL; + if (log->rotateAge) { + struct stat fst_buf; + for (i = 1; i <= rotateCount + 1; i++) { +@@ -1697,7 +1698,6 @@ static int prerotateSingleLog(struct logInfo *log, int logNum, + compext) < 0) { + message(MESS_FATAL, "could not allocate disposeName memory\n"); + } +- newName = strdup(oldName); + + rotNames->disposeName = strdup(oldName); + +@@ -1711,6 +1711,8 @@ static int prerotateSingleLog(struct logInfo *log, int logNum, + if (asprintf(&oldName, "%s/%s.%d%s%s", rotNames->dirName, + rotNames->baseName, i, fileext, compext) < 0) { + message(MESS_FATAL, "could not allocate oldName memory\n"); ++ oldName = NULL; ++ break; + } + + message(MESS_DEBUG, +@@ -1727,11 +1729,9 @@ static int prerotateSingleLog(struct logInfo *log, int logNum, + hasErrors = 1; + } + } +- if (hasErrors || i - 1 < 0) +- free(oldName); +- + } + free(newName); ++ free(oldName); + } /* !LOG_FLAG_DATEEXT */ + + if (log->flags & LOG_FLAG_DATEEXT) { +-- +2.17.1 + diff --git a/SOURCES/rwtab b/SOURCES/rwtab new file mode 100644 index 0000000..3210e47 --- /dev/null +++ b/SOURCES/rwtab @@ -0,0 +1 @@ +dirs /var/lib/logrotate diff --git a/SPECS/logrotate.spec b/SPECS/logrotate.spec new file mode 100644 index 0000000..6a6d107 --- /dev/null +++ b/SPECS/logrotate.spec @@ -0,0 +1,670 @@ +Summary: Rotates, compresses, removes and mails system log files +Name: logrotate +Version: 3.14.0 +Release: 3%{?dist} +License: GPLv2+ +Url: https://github.com/logrotate/logrotate +Source: https://github.com/logrotate/logrotate/releases/download/%{version}/logrotate-%{version}.tar.xz +Source1: rwtab + +BuildRequires: acl +BuildRequires: automake +BuildRequires: gcc +BuildRequires: git +BuildRequires: libacl-devel +BuildRequires: libselinux-devel +BuildRequires: popt-devel +Requires: coreutils + +# document the --version option in the logrotate(8) man page (#1611498) +Patch1: 0001-logrotate-3.14.0-man-version.patch + +# fix programming mistakes detected by Coverity Analysis +Patch2: 0002-logrotate-3.14.0-coverity.patch + +%description +The logrotate utility is designed to simplify the administration of +log files on a system which generates a lot of log files. Logrotate +allows for the automatic rotation compression, removal and mailing of +log files. Logrotate can be set to handle a log file daily, weekly, +monthly or when the log file gets to a certain size. Normally, +logrotate runs as a daily cron job. + +Install the logrotate package if you need a utility to deal with the +log files on your system. + +%prep +%autosetup -S git + +cat >> .gitignore << EOF +/autom4te.cache +/build +/config.h.in~ +EOF +git add .gitignore +git commit -m "update .gitignore" + +%if 0%{?fedora} == 0 && 0%{?rhel} < 7 +sed -e 's/^AM_EXTRA_RECURSIVE_TARGETS/dnl AM_EXTRA_RECURSIVE_TARGETS/' \ + -e 's/ serial-tests//' \ + -i configure.ac +git add configure.ac +git commit -m "configure.ac: compatibility fixes for RHEL-6" +%endif + +autoreconf -fiv +git add --all +git commit -m "force autoreconf" --allow-empty + +%build +mkdir build && cd build +%global _configure ../configure +%configure --with-state-file-path=%{_localstatedir}/lib/logrotate/logrotate.status +make %{?_smp_mflags} V=1 + +%check +make %{?_smp_mflags} -C build check + +%install +%make_install -C build + +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/cron.daily +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/logrotate + +install -p -m 644 examples/logrotate-default $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.conf +install -p -m 644 examples/{b,w}tmp $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/ +install -p -m 755 examples/logrotate.cron $RPM_BUILD_ROOT%{_sysconfdir}/cron.daily/logrotate + +# Make sure logrotate is able to run on read-only root +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rwtab.d +install -m644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/rwtab.d/logrotate + +%pre +# If /var/lib/logrotate/logrotate.status does not exist, create it and copy +# the /var/lib/logrotate.status in it (if it exists). We have to do that in pre +# script, otherwise the /var/lib/logrotate/logrotate.status would not be there, +# because during the update, it is removed/renamed. +if [ ! -d %{_localstatedir}/lib/logrotate/ -a -f %{_localstatedir}/lib/logrotate.status ]; then + mkdir -p %{_localstatedir}/lib/logrotate + cp -a %{_localstatedir}/lib/logrotate.status %{_localstatedir}/lib/logrotate +fi + +%files +%{!?_licensedir:%global license %%doc} +%license COPYING +%doc ChangeLog.md +%{_sbindir}/logrotate +%{_mandir}/man8/logrotate.8* +%{_mandir}/man5/logrotate.conf.5* +%dir %{_sysconfdir}/cron.daily +%config(noreplace) %{_sysconfdir}/cron.daily/logrotate +%config(noreplace) %{_sysconfdir}/logrotate.conf +%dir %{_sysconfdir}/logrotate.d +%config(noreplace) %{_sysconfdir}/logrotate.d/{b,w}tmp +%dir %{_localstatedir}/lib/logrotate +%ghost %verify(not size md5 mtime) %attr(0644, root, root) %{_localstatedir}/lib/logrotate/logrotate.status +%config(noreplace) %{_sysconfdir}/rwtab.d/logrotate + +%changelog +* Fri Aug 10 2018 Kamil Dudka - 3.14.0-3 +- fix programming mistakes detected by Coverity Analysis +- document the --version option in the logrotate(8) man page (#1611498) + +* Wed Jul 11 2018 Kamil Dudka - 3.14.0-2 +- fix license tag to match the source code license + +* Fri Mar 09 2018 Kamil Dudka - 3.14.0-1 +- new upstream version 3.14.0 + +* Mon Feb 19 2018 Kamil Dudka - 3.13.0-3 +- add explicit BR for the gcc compiler + +* Thu Feb 08 2018 Fedora Release Engineering - 3.13.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Fri Oct 13 2017 Kamil Dudka - 3.13.0-1 +- new upstream version 3.13.0 + +* Thu Aug 03 2017 Fedora Release Engineering - 3.12.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 3.12.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Jun 30 2017 Kamil Dudka - 3.12.3-1 +- new upstream version 3.12.3 + +* Tue May 02 2017 Kamil Dudka - 3.12.2-1 +- new upstream version 3.12.2 + +* Fri Apr 21 2017 Kamil Dudka - 3.12.1-1 +- new upstream version 3.12.1 + +* Fri Feb 10 2017 Fedora Release Engineering - 3.11.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Jan 25 2017 Kamil Dudka - 3.11.0-3 +- mark cron.daily/logrotate as config file (#1174207) + +* Thu Dec 08 2016 Kamil Dudka - 3.11.0-2 +- make the package build on RHEL-6, too + +* Fri Dec 02 2016 Kamil Dudka - 3.11.0-1 +- build out of source tree +- new upstream version 3.11.0 + +* Thu Nov 24 2016 Kamil Dudka - 3.10.0-4 +- make /var/lib/logrotate/logrotate.status the default state file (#1381719) + +* Fri Nov 11 2016 Kamil Dudka - 3.10.0-3 +- fix migration of state file from its previous location (#1393247) + +* Tue Aug 23 2016 Kamil Dudka - 3.10.0-2 +- own /etc/cron.daily because no dependency of logrotate installs it +- do not explicitly declare mode for each single installed file + +* Wed Aug 03 2016 Kamil Dudka - 3.10.0-1 +- document default state file used by logrotate cron job (#1357215) +- modernize spec file +- new upstream version 3.10.0 + +* Wed Jul 20 2016 Kamil Dudka - 3.9.2-5 +- do not log to syslog by default (#1304828) + +* Thu Jul 14 2016 Kamil Dudka - 3.9.2-4 +- make the /var/lib/logrotate directory owned by logrotate + +* Tue Feb 16 2016 Marcin Juszkiewicz - 3.9.2-3 +- Fix code indentation to get it build with gcc6. +- Fixed dates in changelog. + +* Thu Feb 04 2016 Fedora Release Engineering - 3.9.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jan 20 2016 Jan Kaluza - 3.9.2-1 +- new upstream version 3.9.2 +- log to syslog + +* Wed Jun 17 2015 Jan Kaluza - 3.9.1-2 +- move logrotate.status to /var/lib/logrotate and add it to rwtab.d (#1127415) + +* Fri Apr 03 2015 Jan Kaluza - 3.9.1-1 +- new upstream version 3.9.1 + +* Fri Apr 03 2015 Jan Kaluza - 3.9.0-1 +- new upstream version 3.9.0 + +* Fri Feb 13 2015 Jan Kaluza - 3.8.9-1 +- new upstream version 3.8.9 + +* Thu Oct 16 2014 Jan Kaluza - 3.8.8-1 +- new upstream version 3.8.8 + +* Sun Aug 17 2014 Fedora Release Engineering - 3.8.7-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Fri Jul 18 2014 Tom Callaway - 3.8.7-3 +- fix license handling + +* Sat Jun 07 2014 Fedora Release Engineering - 3.8.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Thu Oct 10 2013 Jan Kaluza - 3.8.7-1 +- new usptream version 3.8.7 + +* Wed Jul 31 2013 Jan Kaluza - 3.8.6-1 +- new upstream version 3.8.6 + +* Wed Jul 10 2013 Jan Kaluza - 3.8.5-2 +- fix #982409 - do not crash when no logs are rotated and "sharedscripts" and + "prerotate" is used + +* Mon Jun 10 2013 Jan Kaluza - 3.8.5-1 +- new upstream version 3.8.5 + +* Tue May 14 2013 Jan Kaluza - 3.8.4-2 +- do not try to parse config files bigger than 16MB +- remove unused patches + +* Tue Apr 30 2013 Jan Kaluza - 3.8.4-1 +- new upstream version 3.8.4 + +* Thu Feb 14 2013 Fedora Release Engineering - 3.8.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Thu Oct 04 2012 Jan Kaluza 3.8.3-1 +- new upstream version 3.8.3 + +* Thu Jul 19 2012 Jan Kaluza 3.8.2-1 +- new upstream version 3.8.2 +- tests are enabled during build + +* Thu Jul 19 2012 Fedora Release Engineering - 3.8.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed Jan 04 2012 Jan Kaluza 3.8.1-3 +- fix #736054 - check for missing '{' in config file + +* Mon Oct 03 2011 Jan Kaluza 3.8.1-2 +- fix #742731 - man page syntax, formatting, and spelling fixes + +* Tue Sep 06 2011 Jan Kaluza 3.8.1-1 +- new upstream version 3.8.1 + +* Mon Aug 08 2011 Jan Kaluza 3.8.0-5 +- fix #723797 - added maxsize option + +* Mon Aug 01 2011 Jan Kaluza 3.8.0-4 +- fix #726980 - work properly when acl_get_fd is supported, + but acl_set_fd is not + +* Fri Jul 22 2011 Jan Kaluza 3.8.0-3 +- fix #723547 - fixed size directive parsing + +* Wed Jul 20 2011 Jan Kaluza 3.8.0-2 +- fix #722825 - do not redirect logrotate output in cron script + +* Tue Jun 21 2011 Jan Kaluza 3.8.0-1 +- new upstream version 3.8.0 +- removed unused patches + +* Tue May 31 2011 Jan Kaluza 3.7.9-11 +- fix #709034 - work properly when ACLs are not supported + +* Mon May 30 2011 Jan Kaluza 3.7.9-10 +- fix #708367 - fixed mail directive parsing + +* Mon Mar 28 2011 Jan Kaluza 3.7.9-9 +- fix #689061 - added Url + +* Mon Mar 21 2011 Jan Kaluza 3.7.9-8 +- fix #688520 - fixed CVE-2011-1154, CVE-2011-1155 and CVE-2011-1098 + +* Tue Feb 08 2011 Fedora Release Engineering - 3.7.9-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Wed Feb 02 2011 Jan Kaluza 3.7.9-6 +- fix #671926 - fixed crash when tabooext is used in config file + +* Wed Dec 15 2010 Jan Kaluza 3.7.9-5 +- fix #661181 - fixed SIGBUS when config file is empty or 4096 bytes +- fix #666677 - preserve ACLs when rotating files + +* Tue Oct 19 2010 Jan Kaluza 3.7.9-4 +- fix #644309 - mention all logrotate params in man page + +* Wed Sep 29 2010 Jan Kaluza 3.7.9-3 +- fix #638629 - better size directive description + +* Mon Aug 09 2010 Jan Kaluza 3.7.9-2 +- fixed AUTHORS in man page + +* Mon Jun 28 2010 Jan Kaluza 3.7.9-1 +- new upstream version 3.7.9 + +* Tue Jun 22 2010 Jan Kaluza 3.7.8-12 +- fix #602643 - update manpage to reflect scripts changes +- fix #606675 - pass currently rotated file as argument to + postrotate/prerotate script in nosharedscripts mode + +* Tue Jun 15 2010 Jan Kaluza 3.7.8-11 +- fix #603040 - do not remove log if there is an error in + rotate process + +* Tue Apr 20 2010 Jan Kaluza 3.7.8-10 +- fix #602643 - logrotate "size" directive cannot exceed + 1895825408 bytes + +* Tue Apr 20 2010 Daniel Novotny 3.7.8-9 +- revert the "create 0640 root adm" permission change (#489038) + +* Tue Apr 06 2010 Daniel Novotny 3.7.8-8 +- fix #578115 - missingok problem with globs + +* Mon Jan 11 2010 Daniel Novotny 3.7.8-7 +- fix #489038 - RFE: useful permissions on log files + +* Wed Dec 09 2009 Henrique Martins 3.7.8-6 +- fix #545919 (rotate non-writable files when copy is set) + +* Tue Sep 29 2009 Daniel Novotny 3.7.8-5 +- fix #525659 (man page for logrotate.conf) + +* Thu Sep 17 2009 Daniel Novotny 3.7.8-4 +- fix #517321 (logrotate blocking anacron) + +* Sat Jul 25 2009 Fedora Release Engineering - 3.7.8-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Feb 25 2009 Fedora Release Engineering - 3.7.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Mon Feb 02 2009 Daniel Novotny 3.7.8-1 +- new upstream version 3.7.8 + +* Fri Nov 21 2008 Daniel Novotny 3.7.7-4 +- fix #468926 (segfault with very large /var/log/messages) + +* Thu Nov 20 2008 Daniel Novotny 3.7.7-3 +- less aggressive approach to the fix + +* Thu Nov 20 2008 Daniel Novotny 3.7.7-2 +- fix #471463 (selinux problems with logrotate) + +* Mon May 19 2008 Tomas Smetana 3.7.7-1 +- new upstream version + +* Wed Apr 23 2008 Tomas Smetana 3.7.6-4 +- improve patch for #432330 +- fix #437748 - don't forget to close log files + +* Mon Feb 11 2008 Tomas Smetana 3.7.6-3 +- fix #432330 segfault on corrupted status file + +* Mon Jan 21 2008 Tomas Smetana 3.7.6-2.2 +- fix #429454 - logrotate fails due to invalid pointer + +* Wed Jan 09 2008 Tomas Smetana 3.7.6-2.1 +- fix the selinux patch + +* Wed Jan 09 2008 Tomas Smetana 3.7.6-2 +- fix #427274 - logrotate fails to preserve SELinux file contexts +- fix #427661 - SELinux stops vsftpd from working correctly + +* Thu Sep 27 2007 Tomas Smetana 3.7.6-1.3 +- popt-devel dependency was still missing + +* Thu Sep 27 2007 Tomas Smetana 3.7.6-1.2 +- add missing dependencies to spec file + +* Thu Aug 23 2007 Tomas Smetana 3.7.6-1.1 +- rebuild + +* Tue Aug 07 2007 Tomas Smetana 3.7.6-1 +- new upstream version +- fix #248565 logrotate never rotates /var/log/btmp +- fix compile warnings +- tabooext accepts wildcards (related #247816) +- fix minor errors and update man page (related #250059) +- fix handling of size directive (related #247410) + +* Thu May 31 2007 Tomas Smetana 3.7.5-5 +- fix ignoring pre/postrotate arguments (related #241766) + +* Wed May 23 2007 Tomas Smetana 3.7.5-4 +- use dateext in the default config file (#240292) +- add options to use shred for deleting files -- adapt patch sent by + Peter Eckersley (#239934) +- ignore .cfsaved files by default (#223476) + +* Sat Mar 31 2007 Peter Vrabec 3.7.5-3 +- add error checking before running prerotate and postrotate scripts + +* Thu Mar 29 2007 Peter Vrabec 3.7.5-2 +- fix error hadnling after prerotate, postrotate, firstaction + script failure. (http://qa.mandriva.com/show_bug.cgi?id=29979) + +* Thu Mar 01 2007 Peter Vrabec 3.7.5-1 +- new upstream release. + +* Fri Feb 09 2007 Peter Vrabec 3.7.4-13 +- another spec file fixes (#226104) + +* Thu Feb 08 2007 Peter Vrabec 3.7.4-12 +- fix problem with compress_options_list (#227706) +- fix spec file to meet Fedora standards (#226104) + +* Tue Jan 23 2007 Peter Vrabec 3.7.4-11 +- logrotate won't stop if there are some errors in configuration + or glob failures (#166510, #182062) + +* Wed Jan 10 2007 Peter Vrabec 3.7.4-10 +- fix some rpmlint issues + +* Tue Jan 09 2007 Peter Vrabec 3.7.4-9 +- allow multibyte characters in readPath() (#122145) + +* Fri Jan 05 2007 Peter Vrabec 3.7.4-8 +- "size" option was ignored in config files (#221341) + +* Sun Oct 01 2006 Jesse Keating - 3.7.4-7 +- rebuilt for unwind info generation, broken in gcc-4.1.1-21 + +* Tue Sep 26 2006 Peter Vrabec 3.7.4-6 +- fix leaking file descriptor (#205072) + +* Wed Aug 09 2006 Dan Walsh 3.7.4-5 +- Use selinux raw functions + +* Mon Jul 24 2006 Peter Vrabec 3.7.4-4 +- make error message, about ignoring certain config files, + a debug message instead (#196052) + +* Wed Jul 12 2006 Jesse Keating - 3.7.4-3.1 +- rebuild + +* Tue Jun 13 2006 Peter Vrabec 3.7.4-3 +- rename ENOSUP to ENOTSUP + +* Tue Jun 13 2006 Peter Vrabec 3.7.4-2 +- clean up a couple of SELinux problems. Patch from Daniel J. Walsh. + +* Wed May 17 2006 Peter Vrabec 3.7.4-1 +- add new "minsize" option (#173088) + +* Tue Mar 28 2006 Peter Vrabec 3.7.3-3 +- correct man page "extension" option description (#185318) + +* Fri Feb 10 2006 Jesse Keating - 3.7.3-2.2.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 3.7.3-2.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Sun Nov 13 2005 Peter Vrabec 3.7.3-2 +- fix_free_segfaults (#172918) + +* Sat Nov 12 2005 Peter Vrabec 3.7.3-1 +- new upstream release +- indent sources + +* Fri Nov 11 2005 Peter Vrabec 3.7.2-12 +- fix_free_segfaults (#172918) + +* Mon Nov 07 2005 Peter Vrabec 3.7.2-11 +- man description for "nodateext" option (#171577) +- remove not working "pattern" option (#171577) + +* Tue Oct 25 2005 Peter Vrabec 3.7.2-10 +- some more clean up (#171587) + +* Thu Oct 20 2005 Peter Vrabec 3.7.2-9 +- fix_free_segfaults (#171093) + +* Tue Oct 18 2005 Peter Vrabec 3.7.2-8 +- fix leaks of tabooExts + +* Sat Oct 15 2005 Peter Vrabec 3.7.2-7 +- fix_free_segfaults (#170904) + +* Wed Oct 12 2005 Peter Vrabec 3.7.2-6 +- code clean up (#169885) + +* Mon Oct 10 2005 Peter Vrabec 3.7.2-5 +- fix bug introduced in logrotate 3.7.2-3(#169858) +- fix some memory leaks (#169888) + +* Fri Sep 23 2005 Peter Vrabec 3.7.2-4 +- do not run compression program in debug mode (#166912) + +* Wed Sep 07 2005 Peter Vrabec 3.7.2-3 +- even when sharedscript option used, do postrotate + script before compress (#167575) + +* Wed Aug 17 2005 Peter Vrabec 3.7.2-2 +- allow yearly rotations(#134612) + +* Mon Aug 01 2005 Peter Vrabec 3.7.2-1 +- new upstream release + +* Tue Jul 26 2005 Peter Vrabec 3.7.1-14 +- fix some "error running script" messages + +* Tue Jul 26 2005 Peter Vrabec 3.7.1-13 +- fix man page (#163458,#163366) + +* Wed Jun 22 2005 Peter Vrabec 3.7.1-12 +- enhance logrotate with "dateext", "maxage" + +* Thu Mar 31 2005 Dan Walsh 3.7.1-10 +- use security_getenforce() instead of selinux_getenforcemode + +* Thu Mar 17 2005 Dan Walsh 3.7.1-9 +- Add selinux_getenforce() calls to work when not in enforcing mode + +* Thu Mar 17 2005 Peter Vrabec 3.7.1-8 +- rebuild + +* Tue Feb 22 2005 Peter Vrabec +- do not use tmpfile to run script anymore (#149270) + +* Fri Feb 18 2005 Peter Vrabec +- remove logrotate-3.7.1-share.patch, it doesn't solve (#140353) + +* Mon Dec 13 2004 Peter Vrabec - 3.7.1-5 +- Add section to logrotate.conf for "/var/log/btmp" (#117844) + +* Mon Dec 13 2004 Peter Vrabec - 3.7.1-4 +- Typo and missing information in man page (#139346) + +* Mon Dec 06 2004 Peter Vrabec - 3.7.1-3 +- compressed logfiles and logrotate (#140353) + +* Tue Oct 19 2004 Miloslav Trmac - 3.7.1-2 +- Fix sending mails (#131583) +- Preserve file attributes when compressing files (#121523, original patch by + Daniel Himler) + +* Fri Jul 16 2004 Elliot Lee 3.7.1-1 +- Fix #126490 typo + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Mon Jan 26 2004 Dan Walsh 3.6.10-4 +- fix is_selinux_enabled call + +* Fri Sep 5 2003 Dan Walsh 3.6.10-3 +- Turn off selinux + +* Fri Sep 5 2003 Dan Walsh 3.6.10-2.sel +- Turn on selinux + +* Wed Aug 06 2003 Erik Troan +- always use compressext for the extension for compressed + files; before compresscmd and compressext had to agree +- moved all compression to one code block +- compression, scripts don't use system() anymore +- compress and maillast didn't work together properly +- delaycompress and mailfirst didn't work properly +- don't use system() for mailing (or uncompressing) logs anymore +- use "-s" for speciying the subjected of mailed logs + +* Thu Jul 24 2003 Elliot Lee 3.6.10-1 +- Fix #100546, change selinux port. + +* Fri Jul 18 2003 Dan Walsh 3.6.9-2 +- Port to SELinux 2.5 + +* Wed Jul 09 2003 Elliot Lee 3.6.9-1 +- Fix #90229, #90274, #89458, #91408 + +* Mon Jan 20 2003 Elliot Lee 3.6.8-1 +- Old patch from pm@debian.org + +* Tue Jan 14 2003 Elliot Lee 3.6.7-1 +- Fixes from bugzilla + +* Fri Nov 15 2002 Elliot Lee 3.6.6-1 +- Commit patch from Fidelis Assis + +* Thu Jun 20 2002 Elliot Lee 3.6.5-1 +- Commit fix for #65299 + +* Mon Apr 15 2002 Elliot Lee 3.6.4-1 +- Commit fix for #62560 + +* Wed Mar 13 2002 Elliot Lee 3.6.3-1 +- Apply various bugfix patches from the openwall people + +* Tue Jan 29 2002 Elliot Lee 3.6.2-1 +- Fix bug #55809 (include logrotate.status in "files") +- Fix bug #58328 (incorrect error detection when reading state file) +- Allow 'G' size specifier from bug #57242 + +* Mon Dec 10 2001 Preston Brown +- noreplace config file + +* Wed Nov 28 2001 Preston Brown 3.6-1 +- patch from Alexander Kourakos to stop the shared + postrotate/prerotate scripts from running if none of the log(s) need + rotating. All log files are now checked for rotation in one batch, + rather than sequentially. +- more fixes from Paul Martin + +* Thu Nov 8 2001 Preston Brown 3.5.10-1 +- fix from paul martin for zero-length state files + +* Tue Sep 4 2001 Preston Brown +- fix segfault when logfile is in current directory. + +* Tue Aug 21 2001 Preston Brown +- fix URL for source location + +* Thu Aug 2 2001 Preston Brown +- man page cleanups, check for negative rotation counts + +* Mon Jul 2 2001 Preston Brown +- more minor manpage updates (#45625) + +* Thu Jun 21 2001 Preston Brown 3.5.6-1 +- enable LFS support (debian bug #100810) +- quote filenames for running compress commands or pre/postrotate cmds (#21348) +- deprecate "errors" directive (see bug #16544 for explanation) +- update man page +- configurable compression command by Colm Buckley + +* Fri Jun 1 2001 Preston Brown 3.5.5-1 +- be less strict about whitespace near filenames. Patch from Paul Martin . + +* Thu Jan 4 2001 Bill Nottingham +- %%defattr + +* Wed Jan 03 2001 Preston Brown +- see CHANGES + +* Tue Aug 15 2000 Erik Troan +- see CHANGES + +* Sun Jul 23 2000 Erik Troan +- see CHANGES + +* Tue Jul 11 2000 Erik Troan +- support spaces in filenames +- added sharedscripts + +* Sun Jun 18 2000 Matt Wilson +- use %%{_mandir} for man pages + +* Thu Feb 24 2000 Erik Troan +- don't rotate lastlog + +* Thu Feb 03 2000 Erik Troan +- gzipped manpages