summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2004-12-04 07:13:37 +0000
committerRoger Dingledine <arma@torproject.org>2004-12-04 07:13:37 +0000
commit2532e9405e6cbb29e3565e9fefd0d8492c4a9190 (patch)
treec30d13a981182372dc100337d3af9f180f050074
parent5a6e117caff98f9113701977b9dfa86a86d693fc (diff)
downloadtor-2532e9405e6cbb29e3565e9fefd0d8492c4a9190.tar.gz
tor-2532e9405e6cbb29e3565e9fefd0d8492c4a9190.zip
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
-rw-r--r--src/or/connection.c7
-rw-r--r--src/or/connection_edge.c2
2 files changed, 6 insertions, 3 deletions
diff --git a/src/or/connection.c b/src/or/connection.c
index e6b8d001dd..4f076c3d64 100644
--- a/src/or/connection.c
+++ b/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) {
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 8c0ec2b696..1ef8242f5d 100644
--- a/src/or/connection_edge.c
+++ b/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;