Browse Source

avoid racing the mark-for-close when the client hangs up on us
at the same time we get an end relay cell.
(thanks to wmf for reminding me)


svn:r2181

Roger Dingledine 21 years ago
parent
commit
f47fe829dd
2 changed files with 10 additions and 2 deletions
  1. 5 1
      src/or/connection_edge.c
  2. 5 1
      src/or/relay.c

+ 5 - 1
src/or/connection_edge.c

@@ -54,7 +54,11 @@ int connection_edge_process_inbuf(connection_t *conn) {
     /* eof reached, kill it. */
     log_fn(LOG_INFO,"conn (fd %d) reached eof. Closing.", conn->s);
     connection_edge_end(conn, END_STREAM_REASON_DONE, conn->cpath_layer);
-    connection_mark_for_close(conn);
+    if(!conn->marked_for_close) {
+      /* only mark it if not already marked. it's possible to
+       * get the 'end' right around when the client hangs up on us. */
+      connection_mark_for_close(conn);
+    }
     conn->hold_open_until_flushed = 1; /* just because we shouldn't read
                                           doesn't mean we shouldn't write */
     return 0;

+ 5 - 1
src/or/relay.c

@@ -694,7 +694,11 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
 #else
       /* We just *got* an end; no reason to send one. */
       conn->has_sent_end = 1;
-      connection_mark_for_close(conn);
+      if(!conn->marked_for_close) {
+        /* only mark it if not already marked. it's possible to
+         * get the 'end' right around when the client hangs up on us. */
+        connection_mark_for_close(conn);
+      }
       conn->hold_open_until_flushed = 1;
 #endif
       return 0;