]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix a bug where you might flush some data on a tls connection, and then
authorRoger Dingledine <arma@torproject.org>
Fri, 27 Feb 2004 04:42:14 +0000 (04:42 +0000)
committerRoger Dingledine <arma@torproject.org>
Fri, 27 Feb 2004 04:42:14 +0000 (04:42 +0000)
add some more data to be flushed but never turn POLLOUT on. not sure
how commonly this bug was hit, but it would be a doozy.

Also add some asserts to see if it happens elsewhere.

svn:r1142

src/or/connection.c
src/or/main.c
src/or/or.h

index 4d7933696d2245ebc3f42ee05dff2b33224fdadf..1e9876f8c5b6d397927e494527d4d0cdcf6d7f72 100644 (file)
@@ -506,7 +506,7 @@ int connection_handle_write(connection_t *conn) {
   } else {
     if(flush_buf(conn->s, conn->outbuf, &conn->outbuf_flushlen) < 0)
       return -1;
-      /* conns in CONNECTING state will fall through... */
+    /* conns in CONNECTING state will fall through... */
   }
 
   if(!connection_wants_to_flush(conn)) /* it's done flushing */
@@ -527,9 +527,8 @@ void connection_write_to_buf(const char *string, int len, connection_t *conn) {
     return;
   }
 
-  /* XXX if linkpadding, this only applies to conns that aren't open OR connections */
   connection_start_writing(conn);
-#define MIN_TLS_FLUSHLEN 16300
+#define MIN_TLS_FLUSHLEN 15872
 /* openssl tls record size is 16383, this is close. The goal here is to
  * push data out as soon as we know there's enough for a tls record, so
  * during periods of high load we won't read the entire megabyte from
@@ -544,7 +543,11 @@ void connection_write_to_buf(const char *string, int len, connection_t *conn) {
       log_fn(LOG_WARN,"flushing failed.");
     }
   }
-  conn->outbuf_flushlen += len;
+  if(len > 0) { /* if there's any left over */
+    conn->outbuf_flushlen += len;
+    connection_start_writing(conn);
+    /* because connection_handle_write() above might have stopped writing */
+  }
 }
 
 connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) {
@@ -758,6 +761,10 @@ void assert_connection_ok(connection_t *conn, time_t now)
   assert(conn->type >= _CONN_TYPE_MIN);
   assert(conn->type <= _CONN_TYPE_MAX);
 
+  if(conn->outbuf_flushlen > 0) {
+    assert(connection_is_writing(conn) || conn->wants_to_write);
+  }
+
   /* XXX check: wants_to_read, wants_to_write, s, poll_index,
    * marked_for_close. */
 
index 9abb8aef2bc96ed5e5ed2a5d6a07253f5c50ed58..7a394fd5af0c7e8c280c15a4abcfe9fbdf09b122 100644 (file)
@@ -136,6 +136,10 @@ void connection_start_reading(connection_t *conn) {
   poll_array[conn->poll_index].events |= POLLIN;
 }
 
+int connection_is_writing(connection_t *conn) {
+  return poll_array[conn->poll_index].events & POLLOUT;
+}
+
 void connection_stop_writing(connection_t *conn) {
 
   assert(conn && conn->poll_index < nfds);
index 3aff9463797eca2e516cd85fa48f2ec06c319820..d7cd00cdb522b41d8f2d8259c2d38f68ecc188cd 100644 (file)
@@ -748,6 +748,7 @@ void connection_watch_events(connection_t *conn, short events);
 int connection_is_reading(connection_t *conn);
 void connection_stop_reading(connection_t *conn);
 void connection_start_reading(connection_t *conn);
+int connection_is_writing(connection_t *conn);
 void connection_stop_writing(connection_t *conn);
 void connection_start_writing(connection_t *conn);