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 18 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
     - When we are reporting the DirServer line we just parsed, we were
       logging the second stanza of the key fingerprint, not the first.
       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):
   o Minor bugfixes (other):
     - Stop allowing hibernating servers to be "stable" or "fast".
     - Stop allowing hibernating servers to be "stable" or "fast".
     - Check return values from pthread_mutex functions.
     - 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. */
   struct logfile_t *next; /**< Next logfile_t in the linked list. */
   char *filename; /**< Filename to open. */
   char *filename; /**< Filename to open. */
   FILE *file; /**< Stream to receive log messages. */
   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 needs_close; /**< Boolean: true if the stream gets closed on shutdown. */
   int min_loglevel; /**< Lowest severity level to send to this stream. */
   int min_loglevel; /**< Lowest severity level to send to this stream. */
   int max_loglevel; /**< Highest 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;
       lf = lf->next;
       continue;
       continue;
     }
     }
+    if (lf->seems_dead) {
+      lf = lf->next;
+      continue;
+    }
 
 
     if (!formatted) {
     if (!formatted) {
       end_of_prefix =
       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 ||
     if (fputs(buf, lf->file) == EOF ||
         fflush(lf->file) == EOF) { /* error */
         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;
   }
   }
 }
 }