diff --git a/src/core/or/connection_edge.c b/src/core/or/connection_edge.c index 0eff007e36..ab2acaa39c 100644 --- a/src/core/or/connection_edge.c +++ b/src/core/or/connection_edge.c @@ -600,8 +600,7 @@ connected_cell_format_payload(uint8_t *payload_out, /* This is an onion service client connection: Export the client circuit ID * according to the HAProxy proxy protocol. */ STATIC void -export_hs_client_circuit_id(const edge_connection_t *edge_conn, - connection_t *conn, +export_hs_client_circuit_id(edge_connection_t *edge_conn, hs_circuit_id_protocol_t protocol) { /* We only support HAProxy right now. */ @@ -633,7 +632,7 @@ export_hs_client_circuit_id(const edge_connection_t *edge_conn, gid >> 16, gid & 0x0000ffff, dst_ipv6, src_port, dst_port); - connection_buf_add(buf, strlen(buf), conn); + connection_buf_add(buf, strlen(buf), TO_CONN(edge_conn)); tor_free(buf); } @@ -659,14 +658,6 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) conn->state = EXIT_CONN_STATE_OPEN; - /* If it's an onion service connection, we might want to include the proxy - * protocol header: */ - if (edge_conn->hs_ident) { - hs_circuit_id_protocol_t circuit_id_protocol = - hs_service_exports_circuit_id(&edge_conn->hs_ident->identity_pk); - export_hs_client_circuit_id(edge_conn, conn, circuit_id_protocol); - } - connection_watch_events(conn, READ_EVENT); /* stop writing, keep reading */ if (connection_get_outbuf_len(conn)) /* in case there are any queued relay * cells */ @@ -3452,6 +3443,14 @@ handle_hs_exit_conn(circuit_t *circ, edge_connection_t *conn) hs_inc_rdv_stream_counter(origin_circ); + /* If it's an onion service connection, we might want to include the proxy + * protocol header: */ + if (conn->hs_ident) { + hs_circuit_id_protocol_t circuit_id_protocol = + hs_service_exports_circuit_id(&conn->hs_ident->identity_pk); + export_hs_client_circuit_id(conn, circuit_id_protocol); + } + /* Connect tor to the hidden service destination. */ connection_exit_connect(conn); diff --git a/src/core/or/connection_edge.h b/src/core/or/connection_edge.h index c5ad3128a2..5b694428de 100644 --- a/src/core/or/connection_edge.h +++ b/src/core/or/connection_edge.h @@ -246,8 +246,7 @@ STATIC void connection_ap_handshake_rewrite(entry_connection_t *conn, STATIC int connection_ap_process_http_connect(entry_connection_t *conn); STATIC void -export_hs_client_circuit_id(const edge_connection_t *edge_conn, - connection_t *conn, +export_hs_client_circuit_id(edge_connection_t *edge_conn, hs_circuit_id_protocol_t protocol); #endif /* defined(CONNECTION_EDGE_PRIVATE) */ diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c index 955bcc8aff..dace2b63d8 100644 --- a/src/test/test_hs_service.c +++ b/src/test/test_hs_service.c @@ -2047,8 +2047,7 @@ test_export_client_circuit_id(void *arg) or_circ->global_identifier = 666; /* Export circuit ID */ - export_hs_client_circuit_id(edge_conn, conn, - service->config.circuit_id_protocol); + export_hs_client_circuit_id(edge_conn, service->config.circuit_id_protocol); /* Check contents */ cp1 = buf_get_contents(conn->outbuf, &sz); @@ -2059,8 +2058,7 @@ test_export_client_circuit_id(void *arg) or_circ->global_identifier = 22; /* check changes */ - export_hs_client_circuit_id(edge_conn, conn, - service->config.circuit_id_protocol); + export_hs_client_circuit_id(edge_conn, service->config.circuit_id_protocol); cp2 = buf_get_contents(conn->outbuf, &sz); tt_str_op(cp1, OP_NE, cp2); tor_free(cp1); @@ -2068,8 +2066,7 @@ test_export_client_circuit_id(void *arg) /* Check that GID with UINT32_MAX works. */ or_circ->global_identifier = UINT32_MAX; - export_hs_client_circuit_id(edge_conn, conn, - service->config.circuit_id_protocol); + export_hs_client_circuit_id(edge_conn, service->config.circuit_id_protocol); cp1 = buf_get_contents(conn->outbuf, &sz); tt_str_op(cp1, OP_EQ, "PROXY TCP6 fc00:dead:beef:4dad::ffff:ffff ::1 65535 42\r\n"); @@ -2078,8 +2075,7 @@ test_export_client_circuit_id(void *arg) /* Check that GID with UINT16_MAX works. */ or_circ->global_identifier = UINT16_MAX; - export_hs_client_circuit_id(edge_conn, conn, - service->config.circuit_id_protocol); + export_hs_client_circuit_id(edge_conn, service->config.circuit_id_protocol); cp1 = buf_get_contents(conn->outbuf, &sz); tt_str_op(cp1, OP_EQ, "PROXY TCP6 fc00:dead:beef:4dad::0:ffff ::1 65535 42\r\n"); @@ -2088,8 +2084,7 @@ test_export_client_circuit_id(void *arg) /* Check that GID with UINT16_MAX + 7 works. */ or_circ->global_identifier = UINT16_MAX + 7; - export_hs_client_circuit_id(edge_conn, conn, - service->config.circuit_id_protocol); + export_hs_client_circuit_id(edge_conn, service->config.circuit_id_protocol); cp1 = buf_get_contents(conn->outbuf, &sz); tt_str_op(cp1, OP_EQ, "PROXY TCP6 fc00:dead:beef:4dad::1:6 ::1 6 42\r\n");