aboutsummaryrefslogtreecommitdiff
path: root/src/or/connection_or.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2003-11-18 10:17:52 +0000
committerRoger Dingledine <arma@torproject.org>2003-11-18 10:17:52 +0000
commitc00953d2a119b372c46fee27a9655ea00dabb577 (patch)
treed926be0e05fbb7a82f3ad2e4acf61af83e541ae3 /src/or/connection_or.c
parentf0cccc567ecfd318305c4b6bab05091a50532e2a (diff)
downloadtor-c00953d2a119b372c46fee27a9655ea00dabb577.tar
tor-c00953d2a119b372c46fee27a9655ea00dabb577.tar.gz
make more sure we can't end up with two connections to the same OR
fix leaked pk in connection_tls_finish_handshake svn:r839
Diffstat (limited to 'src/or/connection_or.c')
-rw-r--r--src/or/connection_or.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index bd2711230..ecbd7eb70 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -179,7 +179,8 @@ int connection_tls_continue_handshake(connection_t *conn) {
static int connection_tls_finish_handshake(connection_t *conn) {
crypto_pk_env_t *pk;
routerinfo_t *router;
- char nickname[255];
+ char nickname[MAX_NICKNAME_LEN+1];
+ connection_t *otherconn;
conn->state = OR_CONN_STATE_OPEN;
directory_set_dirty();
@@ -195,7 +196,7 @@ static int connection_tls_finish_handshake(connection_t *conn) {
}
}
/* Okay; the other side is an OR. */
- if (tor_tls_get_peer_cert_nickname(conn->tls, nickname, 256)) {
+ if (tor_tls_get_peer_cert_nickname(conn->tls, nickname, MAX_NICKNAME_LEN)) {
log_fn(LOG_WARN,"Other side (%s:%d) has a cert without a valid nickname. Closing.",
conn->address, conn->port);
return -1;
@@ -223,21 +224,20 @@ static int connection_tls_finish_handshake(connection_t *conn) {
}
log_fn(LOG_DEBUG,"The router's pk matches the one we meant to connect to. Good.");
} else {
- if(connection_exact_get_by_addr_port(router->addr,router->or_port)) {
- log_fn(LOG_INFO,"Router %s is already connected. Dropping.", router->nickname);
- crypto_free_pk_env(pk);
- return -1;
- }
connection_or_init_conn_from_router(conn, router);
- crypto_free_pk_env(pk);
}
+ crypto_free_pk_env(pk);
if (strcmp(conn->nickname, nickname)) {
log_fn(LOG_WARN,"Other side claims to be '%s', but we wanted '%s'",
nickname, conn->nickname);
return -1;
}
- if (!options.OnionRouter) {
- /* If I'm an OP... */
+ otherconn = connection_exact_get_by_addr_port(router->addr,router->or_port);
+ if(otherconn && connection_state_is_open(otherconn)) {
+ log_fn(LOG_INFO,"Router %s is already connected. Dropping.", router->nickname);
+ return -1;
+ }
+ if (!options.OnionRouter) { /* If I'm an OP... */
conn->receiver_bucket = conn->bandwidth = DEFAULT_BANDWIDTH_OP;
circuit_n_conn_open(conn); /* send the pending creates, if any. */
}