mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Fix a bug where you might flush some data on a tls connection, and then
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
This commit is contained in:
parent
feafba073d
commit
195dfd35a8
@ -527,9 +527,8 @@ void connection_write_to_buf(const char *string, int len, connection_t *conn) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX if linkpadding, this only applies to conns that aren't open OR connections */
|
|
||||||
connection_start_writing(conn);
|
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
|
/* 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
|
* 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
|
* 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.");
|
log_fn(LOG_WARN,"flushing failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(len > 0) { /* if there's any left over */
|
||||||
conn->outbuf_flushlen += len;
|
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) {
|
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_MIN);
|
||||||
assert(conn->type <= _CONN_TYPE_MAX);
|
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,
|
/* XXX check: wants_to_read, wants_to_write, s, poll_index,
|
||||||
* marked_for_close. */
|
* marked_for_close. */
|
||||||
|
|
||||||
|
@ -136,6 +136,10 @@ void connection_start_reading(connection_t *conn) {
|
|||||||
poll_array[conn->poll_index].events |= POLLIN;
|
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) {
|
void connection_stop_writing(connection_t *conn) {
|
||||||
|
|
||||||
assert(conn && conn->poll_index < nfds);
|
assert(conn && conn->poll_index < nfds);
|
||||||
|
@ -748,6 +748,7 @@ void connection_watch_events(connection_t *conn, short events);
|
|||||||
int connection_is_reading(connection_t *conn);
|
int connection_is_reading(connection_t *conn);
|
||||||
void connection_stop_reading(connection_t *conn);
|
void connection_stop_reading(connection_t *conn);
|
||||||
void connection_start_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_stop_writing(connection_t *conn);
|
||||||
void connection_start_writing(connection_t *conn);
|
void connection_start_writing(connection_t *conn);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user