Bläddra i källkod

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 år sedan
förälder
incheckning
2532e9405e
2 ändrade filer med 6 tillägg och 3 borttagningar
  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;