Browse Source

r13054@catbus: nickm | 2007-05-29 14:20:50 -0400
An even better workaround for the probably-already-fixed bug 222.


svn:r10395

Nick Mathewson 17 years ago
parent
commit
e5ed434c42
2 changed files with 14 additions and 6 deletions
  1. 5 0
      ChangeLog
  2. 9 6
      src/common/log.c

+ 5 - 0
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.

+ 9 - 6
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;
   }
 }