diff --git a/ChangeLog b/ChangeLog index 265e1e1a9e..83c3b7ade0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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 ac28830dfa..a10f00854e 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; } }