Pārlūkot izejas kodu

calling flush_buf and not checking for return value is bad

svn:r1851
Roger Dingledine 21 gadi atpakaļ
vecāks
revīzija
4c9138d640
1 mainītis faili ar 11 papildinājumiem un 5 dzēšanām
  1. 11 5
      src/or/main.c

+ 11 - 5
src/or/main.c

@@ -351,15 +351,21 @@ static void run_connection_housekeeping(int i, time_t now) {
   if(conn->type == CONN_TYPE_DIR &&
   if(conn->type == CONN_TYPE_DIR &&
      !conn->marked_for_close &&
      !conn->marked_for_close &&
      conn->timestamp_lastwritten + 5*60 < now) {
      conn->timestamp_lastwritten + 5*60 < now) {
-    log_fn(LOG_WARN,"Expiring wedged directory conn (purpose %d)", conn->purpose);
+    log_fn(LOG_WARN,"Expiring wedged directory conn (fd %d, purpose %d)", conn->s, conn->purpose);
     /* XXXX This next check may help isolate where the pesky EPIPE bug
     /* XXXX This next check may help isolate where the pesky EPIPE bug
      * really occurs. */
      * really occurs. */
     if (connection_wants_to_flush(conn)) {
     if (connection_wants_to_flush(conn)) {
-      flush_buf(conn->s, conn->outbuf, &conn->outbuf_flushlen);
+      if(flush_buf(conn->s, conn->outbuf, &conn->outbuf_flushlen) < 0) {
+        log_fn(LOG_WARN,"flushing expired directory conn failed.");
+        connection_close_immediate(conn);
+        connection_mark_for_close(conn,0);
+        /*  */
+      } else {
+        /* XXXX Does this next part make sense, really? */
+        connection_mark_for_close(conn,0);
+        conn->hold_open_until_flushed = 1; /* give it a last chance */
+      }
     }
     }
-    connection_mark_for_close(conn,0);
-    /* XXXX Does this next part make sense, really? */
-    conn->hold_open_until_flushed = 1; /* give it a last chance */
     return;
     return;
   }
   }