]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
bugfix on a really old bug:
authorRoger Dingledine <arma@torproject.org>
Thu, 14 Oct 2004 09:28:31 +0000 (09:28 +0000)
committerRoger Dingledine <arma@torproject.org>
Thu, 14 Oct 2004 09:28:31 +0000 (09:28 +0000)
if read() fails on a stream, send back an end cell before you
close it down.

svn:r2509

src/or/connection.c

index 090922b0a7ffcd0d48bf3d111560f60b68e6c132..a5e857cf6c299aa72de2ba80da4298334d21279e 100644 (file)
@@ -733,14 +733,18 @@ int connection_handle_read(connection_t *conn) {
   if(connection_read_to_buf(conn) < 0) {
     /* There's a read error; kill the connection.*/
     connection_close_immediate(conn); /* Don't flush; connection is dead. */
-    conn->has_sent_end = 1; /* XXX have we already sent the end? really? */
+    if(conn->type == CONN_TYPE_AP || conn->type == CONN_TYPE_EXIT) {
+      connection_edge_end(conn, connection_state_is_open(conn) ?
+                          END_STREAM_REASON_MISC : END_STREAM_REASON_CONNECTFAILED,
+                          conn->cpath_layer);
+    }
     connection_mark_for_close(conn);
     if(conn->type == CONN_TYPE_DIR &&
        conn->state == DIR_CONN_STATE_CONNECTING) {
        /* it's a directory server and connecting failed: forget about this router */
        /* XXX I suspect pollerr may make Windows not get to this point. :( */
        router_mark_as_down(conn->identity_digest);
-       if(conn->purpose == DIR_PURPOSE_FETCH_DIR && 
+       if(conn->purpose == DIR_PURPOSE_FETCH_DIR &&
           !all_trusted_directory_servers_down()) {
          log_fn(LOG_INFO,"Giving up on dirserver %s; trying another.", conn->address);
          directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, NULL, 0);