From 27adc0f20bd0d5f0e5b90a695394518072316d8d Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Tue, 3 Sep 2002 18:36:40 +0000 Subject: [PATCH] enforce maxconn; bugfix to not tear down the parent when we hit maxconn svn:r86 --- src/or/config.c | 6 ++++++ src/or/connection.c | 13 +++++++++---- src/or/main.c | 5 +---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/or/config.c b/src/or/config.c index 3977d494e4..7a7be11369 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -218,6 +218,12 @@ RETURN VALUE: 0 on success, non-zero on error code = -1; } + if ( options->MaxConn >= MAXCONNECTIONS ) + { + log(LOG_ERR,"MaxConn option must be less than %d.", MAXCONNECTIONS); + code = -1; + } + if ( options->TrafficShaping != 0 && options->TrafficShaping != 1 ) { log(LOG_ERR,"TrafficShaping option must be either 0 or 1."); diff --git a/src/or/connection.c b/src/or/connection.c index 1fa6779065..a6acc003dd 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -122,8 +122,10 @@ void connection_free(connection_t *conn) { crypto_free_cipher_env(conn->b_crypto); } - if(conn->s > 0) + if(conn->s > 0) { + log(LOG_INFO,"connection_free(): closing fd %d.",conn->s); close(conn->s); + } free(conn); } @@ -156,11 +158,14 @@ int connection_create_listener(crypto_pk_env_t *prkey, struct sockaddr_in *local fcntl(s, F_SETFL, O_NONBLOCK); /* set s to non-blocking */ conn = connection_new(type); - if(!conn) + if(!conn) { + log(LOG_DEBUG,"connection_create_listener(): connection_new failed. Giving up."); return -1; + } conn->s = s; if(connection_add(conn) < 0) { /* no space, forget it */ + log(LOG_DEBUG,"connection_create_listener(): connection_add failed. Giving up."); connection_free(conn); return -1; } @@ -192,7 +197,7 @@ int connection_handle_listener_read(connection_t *conn, int new_type, int new_st log(LOG_ERR,"connection_handle_listener_read(): accept() failed. Closing."); return -1; } - log(LOG_DEBUG,"Connection accepted on socket %d.",news); + log(LOG_INFO,"Connection accepted on socket %d (child of fd %d).",news, conn->s); fcntl(news, F_SETFL, O_NONBLOCK); /* set news to non-blocking */ @@ -211,7 +216,7 @@ int connection_handle_listener_read(connection_t *conn, int new_type, int new_st if(connection_add(newconn) < 0) { /* no space, forget it */ connection_free(newconn); - return -1; + return 0; /* no need to tear down the parent */ } log(LOG_DEBUG,"connection_handle_listener_read(): socket %d entered state %d.",newconn->s, new_state); diff --git a/src/or/main.c b/src/or/main.c index d1b49d05b0..2b9fefa529 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -36,8 +36,7 @@ static int rarray_len = 0; int connection_add(connection_t *conn) { - if(nfds >= MAXCONNECTIONS-2) { /* 2, for some breathing room. should count the fenceposts. */ - /* FIXME should use the 'max connections' option */ + if(nfds >= options.MaxConn-1) { log(LOG_INFO,"connection_add(): failing because nfds is too high."); return -1; } @@ -55,7 +54,6 @@ int connection_add(connection_t *conn) { log(LOG_INFO,"connection_add(): new conn type %d, socket %d, nfds %d.",conn->type, conn->s, nfds); return 0; - } void connection_set_poll_socket(connection_t *conn) { @@ -73,7 +71,6 @@ int connection_remove(connection_t *conn) { current_index = conn->poll_index; if(current_index == nfds-1) { /* this is the end */ -// connection_free(conn); nfds--; return 0; }