Browse Source

Now we allow writing to the buffer even when the stream if marked for
close, if we're planning to wait to flush it.

This is important because we were sending a socks reject back if we're
closing and hadn't already sent one, but it wasn't actually getting
written since the conn was already marked-for-close.


svn:r3074

Roger Dingledine 21 years ago
parent
commit
2532e9405e
2 changed files with 6 additions and 3 deletions
  1. 5 2
      src/or/connection.c
  2. 1 1
      src/or/connection_edge.c

+ 5 - 2
src/or/connection.c

@@ -235,9 +235,9 @@ void connection_about_to_close_connection(connection_t *conn)
     case CONN_TYPE_AP:
       if (conn->socks_request->has_finished == 0) {
         log_fn(LOG_INFO,"Cleaning up AP -- sending socks reject.");
+        conn->hold_open_until_flushed = 1;
         connection_ap_handshake_socks_reply(conn, NULL, 0, -1);
         conn->socks_request->has_finished = 1;
-        conn->hold_open_until_flushed = 1;
       } else {
         control_event_stream_status(conn, STREAM_EVENT_CLOSED);
       }
@@ -1105,7 +1105,10 @@ int connection_handle_write(connection_t *conn) {
  */
 void connection_write_to_buf(const char *string, size_t len, connection_t *conn) {
 
-  if (!len || conn->marked_for_close)
+  if (!len)
+    return;
+  /* if it's marked for close, only allow write if we mean to flush it */
+  if (conn->marked_for_close && !conn->hold_open_until_flushed)
     return;
 
   if (write_to_buf(string, len, conn->outbuf) < 0) {

+ 1 - 1
src/or/connection_edge.c

@@ -71,7 +71,7 @@ int connection_edge_process_inbuf(connection_t *conn, int package_partial) {
       if (connection_ap_handshake_process_socks(conn) < 0) {
         conn->has_sent_end = 1; /* no circ yet */
         connection_mark_for_close(conn);
-        conn->hold_open_until_flushed = 1;
+        conn->hold_open_until_flushed = 1; /* redundant but shouldn't hurt */
         return -1;
       }
       return 0;