Bug 7999
Summary: | filenames with spaces break logrotate status file | ||
---|---|---|---|
Product: | [Retired] Red Hat Linux | Reporter: | Ingo Luetkebohle <ingo> |
Component: | logrotate | Assignee: | Erik Troan <ewt> |
Status: | CLOSED RAWHIDE | QA Contact: | |
Severity: | medium | Docs Contact: | |
Priority: | medium | ||
Version: | 6.1 | ||
Target Milestone: | --- | ||
Target Release: | --- | ||
Hardware: | All | ||
OS: | Linux | ||
Whiteboard: | |||
Fixed In Version: | Doc Type: | Bug Fix | |
Doc Text: | Story Points: | --- | |
Clone Of: | Environment: | ||
Last Closed: | 2000-07-13 13:15:14 UTC | Type: | --- |
Regression: | --- | Mount Type: | --- |
Documentation: | --- | CRM: | |
Verified Versions: | Category: | --- | |
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
Cloudforms Team: | --- | Target Upstream Version: | |
Embargoed: |
Description
Ingo Luetkebohle
1999-12-26 10:15:04 UTC
Note that spaces can also crop up if you say /var/log/samba/* for example, because some machines have spaces in their names. The following patch is a (pretty bad, actually) way to fix it. It changes the format of the logrotate.status file so that the filename is on a line by itself so that it can read by a pair of fgets() instead of just one. A better way would probably be something like URL-encoding the filename instead. It will also now print out the line number in the "line too long" error. Since this changes the format, the old /var/lib/logrotate.status file will need to be removed or translated. --- logrotate-3.3.2.orig/logrotate.c Wed Jun 16 16:44:07 1999 +++ logrotate-3.3.2/logrotate.c Sat May 13 13:05:54 2000 @@ -661,7 +661,7 @@ fprintf(f, "logrotate state -- version 1\n"); for (i = 0; i < numStates; i++) { - fprintf(f, "%s %d-%d-%d\n", states[i].fn, + fprintf(f, "%s\n%d-%d-%d\n", states[i].fn, states[i].lastRotated.tm_year + 1900, states[i].lastRotated.tm_mon + 1, states[i].lastRotated.tm_mday); @@ -717,19 +717,23 @@ line++; - while (fgets(buf, sizeof(buf) - 1, f)) { + while (fgets(buf2, sizeof(buf2) - 1, f)) { line++; - i = strlen(buf); - if (buf[i - 1] != '\n') { - message(MESS_ERROR, "line too long in state file %s\n", - stateFilename); + i = strlen(buf2); + if (buf2[i - 1] != '\n') { + message(MESS_ERROR, "line %d too long in state file %s\n", + line, stateFilename); fclose(f); return 1; } + buf2[i-1] = '\0'; if (i == 1) continue; - if (sscanf(buf, "%s %d-%d-%d\n", buf2, &year, &month, &day) != 4) { + fgets(buf, sizeof(buf) - 1, f); + line++; + + if (sscanf(buf, "%d-%d-%d\n", &year, &month, &day) != 3) { message(MESS_ERROR, "bad line %d in state file %s\n", line, stateFilename); fclose(f); *** Bug 11654 has been marked as a duplicate of this bug. *** This is (finally) fixed in logrotate 3.4, which will show up in rawhide soon. |