aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-05-05 01:26:57 +0000
committerNick Mathewson <nickm@torproject.org>2004-05-05 01:26:57 +0000
commit2ba0776b027db8fa619b61fb074bf2400ac18728 (patch)
tree2f217a760e380760ac2f6efd1f4b5a0c35327a92
parentd49d3dcc7bc19e9b9fb2aa29f7d94379a8aedf52 (diff)
downloadtor-2ba0776b027db8fa619b61fb074bf2400ac18728.tar
tor-2ba0776b027db8fa619b61fb074bf2400ac18728.tar.gz
Only connection_add connections once they have conn->s sett; refactor code around this. Should make stuff more bulletproof.
svn:r1788
-rw-r--r--src/or/circuit.c1
-rw-r--r--src/or/connection.c9
-rw-r--r--src/or/connection_edge.c10
-rw-r--r--src/or/connection_or.c10
-rw-r--r--src/or/directory.c10
-rw-r--r--src/or/main.c7
-rw-r--r--src/or/or.h1
7 files changed, 15 insertions, 33 deletions
diff --git a/src/or/circuit.c b/src/or/circuit.c
index 184bfb93c..598701948 100644
--- a/src/or/circuit.c
+++ b/src/or/circuit.c
@@ -619,7 +619,6 @@ void circuit_build_needed_circs(time_t now) {
}
/* XXX count idle rendezvous circs and build more */
-
}
/* update digest from the payload of cell. assign integrity part to cell. */
diff --git a/src/or/connection.c b/src/or/connection.c
index 9b3100e0f..c163cd863 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -365,10 +365,11 @@ static int connection_init_accepted_conn(connection_t *conn) {
return 0;
}
-/* take conn, make a nonblocking socket; try to connect to
+/* Take conn, make a nonblocking socket; try to connect to
* addr:port (they arrive in *host order*). If fail, return -1. Else
* assign s to conn->s: if connected return 1, if eagain return 0.
- * address is used to make the logs useful.
+ * address is used to make the logs useful. On success, add 'conn' to
+ * the list of polled connections.
*/
int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port) {
int s;
@@ -398,6 +399,8 @@ int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_
} else {
/* it's in progress. set state appropriately and return. */
conn->s = s;
+ if(connection_add(conn) < 0) /* no space, forget it */
+ return -1;
log_fn(LOG_DEBUG,"connect in progress, socket %d.",s);
return 0;
}
@@ -406,6 +409,8 @@ int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_
/* it succeeded. we're connected. */
log_fn(LOG_INFO,"Connection to %s:%u established.",address,port);
conn->s = s;
+ if(connection_add(conn) < 0) /* no space, forget it */
+ return -1;
return 1;
}
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index d4dd2d42e..38f8f9005 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -1179,11 +1179,6 @@ static int connection_exit_begin_conn(cell_t *cell, circuit_t *circ) {
/* leave n_stream->s at -1, because it's not yet valid */
n_stream->package_window = STREAMWINDOW_START;
n_stream->deliver_window = STREAMWINDOW_START;
- if(connection_add(n_stream) < 0) { /* no space, forget it */
- log_fn(LOG_WARN,"connection_add failed. Dropping.");
- connection_free(n_stream);
- return 0;
- }
log_fn(LOG_DEBUG,"finished adding conn");
@@ -1202,6 +1197,7 @@ static int connection_exit_begin_conn(cell_t *cell, circuit_t *circ) {
if(rend_service_set_connection_addr_port(n_stream, circ) < 0) {
log_fn(LOG_INFO,"Didn't find rendezvous service (port %d)",n_stream->port);
connection_mark_for_close(n_stream, END_STREAM_REASON_EXITPOLICY);
+ connection_free(n_stream);
circuit_mark_for_close(circ); /* knock the whole thing down, somebody screwed up */
return 0;
}
@@ -1223,6 +1219,7 @@ static int connection_exit_begin_conn(cell_t *cell, circuit_t *circ) {
case -1: /* resolve failed */
log_fn(LOG_INFO,"Resolve failed (%s).", n_stream->address);
connection_mark_for_close(n_stream, END_STREAM_REASON_RESOLVEFAILED);
+ connection_free(n_stream);
break;
case 0: /* resolve added to pending list */
;
@@ -1244,9 +1241,9 @@ void connection_exit_connect(connection_t *conn) {
switch(connection_connect(conn, conn->address, conn->addr, conn->port)) {
case -1:
connection_mark_for_close(conn, END_STREAM_REASON_CONNECTFAILED);
+ connection_free(conn);
return;
case 0:
- connection_set_poll_socket(conn);
conn->state = EXIT_CONN_STATE_CONNECTING;
connection_watch_events(conn, POLLOUT | POLLIN | POLLERR);
@@ -1256,7 +1253,6 @@ void connection_exit_connect(connection_t *conn) {
/* case 1: fall through */
}
- connection_set_poll_socket(conn);
conn->state = EXIT_CONN_STATE_OPEN;
if(connection_wants_to_flush(conn)) { /* in case there are any queued data cells */
log_fn(LOG_WARN,"tell roger: newly connected conn had data waiting!");
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 02ee368a0..133caca47 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -111,17 +111,11 @@ connection_t *connection_or_connect(routerinfo_t *router) {
connection_or_init_conn_from_router(conn, router);
conn->state = OR_CONN_STATE_CONNECTING;
- if(connection_add(conn) < 0) { /* no space, forget it */
- connection_free(conn);
- return NULL;
- }
-
switch(connection_connect(conn, router->address, router->addr, router->or_port)) {
case -1:
- connection_mark_for_close(conn, 0);
+ connection_free(conn);
return NULL;
case 0:
- connection_set_poll_socket(conn);
connection_watch_events(conn, POLLIN | POLLOUT | POLLERR);
/* writable indicates finish, readable indicates broken link,
error indicates broken link on windows */
@@ -129,8 +123,6 @@ connection_t *connection_or_connect(routerinfo_t *router) {
/* case 1: fall through */
}
- connection_set_poll_socket(conn);
-
if(connection_tls_start_handshake(conn, 0) >= 0)
return conn;
diff --git a/src/or/directory.c b/src/or/directory.c
index 9c6722390..e7f2608d3 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -50,11 +50,6 @@ void directory_initiate_command(routerinfo_t *router, int purpose,
conn->purpose = purpose;
- if(connection_add(conn) < 0) { /* no space, forget it */
- connection_free(conn);
- return;
- }
-
/* queue the command on the outbuf */
directory_send_command(conn, purpose, payload, payload_len);
@@ -67,13 +62,12 @@ void directory_initiate_command(routerinfo_t *router, int purpose,
switch(connection_connect(conn, conn->address, conn->addr, conn->port)) {
case -1:
router_mark_as_down(conn->nickname); /* don't try him again */
- connection_mark_for_close(conn, 0);
+ connection_free(conn);
return;
case 1:
conn->state = DIR_CONN_STATE_CLIENT_SENDING; /* start flushing conn */
/* fall through */
case 0:
- connection_set_poll_socket(conn);
connection_watch_events(conn, POLLIN | POLLOUT | POLLERR);
/* writable indicates finish, readable indicates broken link,
error indicates broken link in windowsland. */
@@ -91,7 +85,7 @@ void directory_initiate_command(routerinfo_t *router, int purpose,
}
conn->state = DIR_CONN_STATE_CLIENT_SENDING;
- connection_set_poll_socket(conn);
+ connection_add(conn);
connection_start_reading(conn);
}
}
diff --git a/src/or/main.c b/src/or/main.c
index 122af87bb..8c757bedf 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -54,6 +54,7 @@ int has_completed_circuit=0;
int connection_add(connection_t *conn) {
tor_assert(conn);
+ tor_assert(conn->s >= 0);
if(nfds >= options.MaxConn-1) {
log_fn(LOG_WARN,"failing because nfds is too high.");
@@ -61,10 +62,10 @@ int connection_add(connection_t *conn) {
}
conn->poll_index = nfds;
- connection_set_poll_socket(conn);
connection_array[nfds] = conn;
/* zero these out here, because otherwise we'll inherit values from the previously freed one */
+ poll_array[nfds].fd = conn->s;
poll_array[nfds].events = 0;
poll_array[nfds].revents = 0;
@@ -76,10 +77,6 @@ int connection_add(connection_t *conn) {
return 0;
}
-void connection_set_poll_socket(connection_t *conn) {
- poll_array[conn->poll_index].fd = conn->s;
-}
-
/* Remove the connection from the global list, and remove the
* corresponding poll entry. Calling this function will shift the last
* connection (if any) into the position occupied by conn.
diff --git a/src/or/or.h b/src/or/or.h
index b0c8fa6de..4024c18c9 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -913,7 +913,6 @@ int dns_resolve(connection_t *exitconn);
int connection_add(connection_t *conn);
int connection_remove(connection_t *conn);
-void connection_set_poll_socket(connection_t *conn);
void get_connection_array(connection_t ***array, int *n);