mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 13:53:31 +01:00
enforce maxconn; bugfix to not tear down the parent when we hit maxconn
svn:r86
This commit is contained in:
parent
db4c2140c3
commit
27adc0f20b
@ -218,6 +218,12 @@ RETURN VALUE: 0 on success, non-zero on error
|
|||||||
code = -1;
|
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 )
|
if ( options->TrafficShaping != 0 && options->TrafficShaping != 1 )
|
||||||
{
|
{
|
||||||
log(LOG_ERR,"TrafficShaping option must be either 0 or 1.");
|
log(LOG_ERR,"TrafficShaping option must be either 0 or 1.");
|
||||||
|
@ -122,8 +122,10 @@ void connection_free(connection_t *conn) {
|
|||||||
crypto_free_cipher_env(conn->b_crypto);
|
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);
|
close(conn->s);
|
||||||
|
}
|
||||||
free(conn);
|
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 */
|
fcntl(s, F_SETFL, O_NONBLOCK); /* set s to non-blocking */
|
||||||
|
|
||||||
conn = connection_new(type);
|
conn = connection_new(type);
|
||||||
if(!conn)
|
if(!conn) {
|
||||||
|
log(LOG_DEBUG,"connection_create_listener(): connection_new failed. Giving up.");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
conn->s = s;
|
conn->s = s;
|
||||||
|
|
||||||
if(connection_add(conn) < 0) { /* no space, forget it */
|
if(connection_add(conn) < 0) { /* no space, forget it */
|
||||||
|
log(LOG_DEBUG,"connection_create_listener(): connection_add failed. Giving up.");
|
||||||
connection_free(conn);
|
connection_free(conn);
|
||||||
return -1;
|
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.");
|
log(LOG_ERR,"connection_handle_listener_read(): accept() failed. Closing.");
|
||||||
return -1;
|
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 */
|
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 */
|
if(connection_add(newconn) < 0) { /* no space, forget it */
|
||||||
connection_free(newconn);
|
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);
|
log(LOG_DEBUG,"connection_handle_listener_read(): socket %d entered state %d.",newconn->s, new_state);
|
||||||
|
@ -36,8 +36,7 @@ static int rarray_len = 0;
|
|||||||
|
|
||||||
int connection_add(connection_t *conn) {
|
int connection_add(connection_t *conn) {
|
||||||
|
|
||||||
if(nfds >= MAXCONNECTIONS-2) { /* 2, for some breathing room. should count the fenceposts. */
|
if(nfds >= options.MaxConn-1) {
|
||||||
/* FIXME should use the 'max connections' option */
|
|
||||||
log(LOG_INFO,"connection_add(): failing because nfds is too high.");
|
log(LOG_INFO,"connection_add(): failing because nfds is too high.");
|
||||||
return -1;
|
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);
|
log(LOG_INFO,"connection_add(): new conn type %d, socket %d, nfds %d.",conn->type, conn->s, nfds);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void connection_set_poll_socket(connection_t *conn) {
|
void connection_set_poll_socket(connection_t *conn) {
|
||||||
@ -73,7 +71,6 @@ int connection_remove(connection_t *conn) {
|
|||||||
|
|
||||||
current_index = conn->poll_index;
|
current_index = conn->poll_index;
|
||||||
if(current_index == nfds-1) { /* this is the end */
|
if(current_index == nfds-1) { /* this is the end */
|
||||||
// connection_free(conn);
|
|
||||||
nfds--;
|
nfds--;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user