diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-05-29 18:21:00 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-05-29 18:21:00 +0000 |
commit | e5ed434c42cd379847bff63851bd623b252c25a3 (patch) | |
tree | 7c85dcd5bc54d37cdbfc7f5e6aa11911663f734f | |
parent | 9d1af71b70d7f7253976e97633fd4d1e1d395d77 (diff) | |
download | tor-e5ed434c42cd379847bff63851bd623b252c25a3.tar tor-e5ed434c42cd379847bff63851bd623b252c25a3.tar.gz |
r13054@catbus: nickm | 2007-05-29 14:20:50 -0400
An even better workaround for the probably-already-fixed bug 222.
svn:r10395
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/common/log.c | 15 |
2 files changed, 14 insertions, 6 deletions
@@ -135,6 +135,11 @@ Changes in version 0.2.0.1-alpha - 2007-??-?? - When we are reporting the DirServer line we just parsed, we were logging the second stanza of the key fingerprint, not the first. + o Minor bugfixes (logging): + - When we hit an EOF on a log (probably because we're shutting down), + don't try to remove the log from the list: just mark it as + unusable. (Bulletproofs against bug 222.) + o Minor bugfixes (other): - Stop allowing hibernating servers to be "stable" or "fast". - Check return values from pthread_mutex functions. diff --git a/src/common/log.c b/src/common/log.c index ac28830df..a10f00854 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -35,6 +35,7 @@ typedef struct logfile_t { struct logfile_t *next; /**< Next logfile_t in the linked list. */ char *filename; /**< Filename to open. */ FILE *file; /**< Stream to receive log messages. */ + int seems_dead; /**< Boolean: true if the stream seems to be kaput. */ int needs_close; /**< Boolean: true if the stream gets closed on shutdown. */ int min_loglevel; /**< Lowest severity level to send to this stream. */ int max_loglevel; /**< Highest severity level to send to this stream. */ @@ -247,6 +248,10 @@ logv(int severity, uint32_t domain, const char *funcname, const char *format, lf = lf->next; continue; } + if (lf->seems_dead) { + lf = lf->next; + continue; + } if (!formatted) { end_of_prefix = @@ -268,13 +273,11 @@ logv(int severity, uint32_t domain, const char *funcname, const char *format, } if (fputs(buf, lf->file) == EOF || fflush(lf->file) == EOF) { /* error */ - /* don't log the error! Blow away this log entry and continue. */ - logfile_t *victim = lf; - lf = victim->next; - delete_log(victim); - } else { - lf = lf->next; + /* don't log the error! mark this log entry to be blown away, and + * continue. */ + lf->seems_dead = 1; } + lf = lf->next; } } |