|
@@ -728,10 +728,9 @@ command_process_versions_cell(var_cell_t *cell, or_connection_t *conn)
|
|
|
const int send_certs = !started_here || public_server_mode(get_options());
|
|
|
/* If we're a relay that got a connection, ask for authentication. */
|
|
|
const int send_chall = !started_here && public_server_mode(get_options());
|
|
|
- /* If our certs cell will authenticate us, or if we have no intention of
|
|
|
- * authenticating, send a netinfo cell right now. */
|
|
|
- const int send_netinfo =
|
|
|
- !(started_here && public_server_mode(get_options()));
|
|
|
+ /* If our certs cell will authenticate us, we can send a netinfo cell
|
|
|
+ * right now. */
|
|
|
+ const int send_netinfo = !started_here;
|
|
|
const int send_any =
|
|
|
send_versions || send_certs || send_chall || send_netinfo;
|
|
|
tor_assert(conn->link_proto >= 3);
|
|
@@ -958,6 +957,7 @@ command_process_certs_cell(var_cell_t *cell, or_connection_t *conn)
|
|
|
|
|
|
uint8_t *ptr;
|
|
|
int n_certs, i;
|
|
|
+ int send_netinfo = 0;
|
|
|
|
|
|
if (conn->_base.state != OR_CONN_STATE_OR_HANDSHAKING_V3)
|
|
|
ERR("We're not doing a v3 handshake!");
|
|
@@ -1072,6 +1072,13 @@ command_process_certs_cell(var_cell_t *cell, or_connection_t *conn)
|
|
|
|
|
|
conn->handshake_state->id_cert = id_cert;
|
|
|
id_cert = NULL;
|
|
|
+
|
|
|
+ if (!public_server_mode(get_options())) {
|
|
|
+ /* If we initiated the connection and we are not a public server, we
|
|
|
+ * aren't planning to authenticate at all. At this point we know who we
|
|
|
+ * are talking to, so we can just send a netinfo now. */
|
|
|
+ send_netinfo = 1;
|
|
|
+ }
|
|
|
} else {
|
|
|
if (! (id_cert && auth_cert))
|
|
|
ERR("The certs we wanted were missing");
|
|
@@ -1093,6 +1100,15 @@ command_process_certs_cell(var_cell_t *cell, or_connection_t *conn)
|
|
|
}
|
|
|
|
|
|
conn->handshake_state->received_certs_cell = 1;
|
|
|
+
|
|
|
+ if (send_netinfo) {
|
|
|
+ if (connection_or_send_netinfo(conn) < 0) {
|
|
|
+ log_warn(LD_OR, "Couldn't send netinfo cell");
|
|
|
+ connection_mark_for_close(TO_CONN(conn));
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
err:
|
|
|
tor_cert_free(id_cert);
|
|
|
tor_cert_free(link_cert);
|