about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2008-08-30 15:37:19 +0200
committerFlorian Westphal <fw@strlen.de>2008-08-30 15:37:19 +0200
commitc997e043259af2663f40349490729668c7b61256 (patch)
tree691a4b7fbe20b6f3390418994602eb59459a4488
parent2c2c93e311c09faa68cbdb4939902c2bca2d5383 (diff)
downloadngircd-c997e043259af2663f40349490729668c7b61256.tar.gz
ngircd-c997e043259af2663f40349490729668c7b61256.zip
Fix handling of MaxConnections option
Config option claimed to be 'number of connections' but in reality this
was treated as 'largest file descriptor allowed'.

This also fixes another bug in New_connection, where the
ng_ipaddr_tostr_r error path was missing a return statement.
-rw-r--r--src/ngircd/conn.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index 2e23ade8..a0f7f242 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -90,6 +90,7 @@ static int NewListener PARAMS(( const char *listen_addr, UINT16 Port ));
 
 static array My_Listeners;
 static array My_ConnArray;
+static size_t NumConnections;
 
 #ifdef TCPWRAP
 int allow_severity = LOG_INFO;
@@ -106,7 +107,8 @@ static void
 cb_listen(int sock, short irrelevant)
 {
 	(void) irrelevant;
-	New_Connection( sock );
+	if (New_Connection( sock ) >= 0)
+		NumConnections++;
 }
 
 
@@ -212,12 +214,10 @@ Conn_Init( void )
 
 	/* Speicher fuer Verbindungs-Pool anfordern */
 	Pool_Size = CONNECTION_POOL;
-	if( Conf_MaxConnections > 0 )
-	{
-		/* konfiguriertes Limit beachten */
-		if( Pool_Size > Conf_MaxConnections ) Pool_Size = Conf_MaxConnections;
-	}
-	
+	if ((Conf_MaxConnections > 0) &&
+		(Pool_Size > Conf_MaxConnections))
+			Pool_Size = Conf_MaxConnections;
+
 	if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), (size_t)Pool_Size)) {
 		Log( LOG_EMERG, "Can't allocate memory! [Conn_Init]" );
 		exit( 1 );
@@ -887,7 +887,10 @@ Conn_Close( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient )
 	/* Clean up connection structure (=free it) */
 	Init_Conn_Struct( Idx );
 
-	LogDebug("Shutdown of connection %d completed.", Idx );
+	assert(NumConnections > 0);
+	if (NumConnections)
+		NumConnections--;
+	LogDebug("Shutdown of connection %d completed", Idx );
 } /* Conn_Close */
 
 
@@ -1010,7 +1013,7 @@ New_Connection( int Sock )
 #endif
 	ng_ipaddr_t new_addr;
 	char ip_str[NG_INET_ADDRSTRLEN];
-	int new_sock, new_sock_len, new_Pool_Size;
+	int new_sock, new_sock_len;
 	CLIENT *c;
 	long cnt;
 
@@ -1029,6 +1032,7 @@ New_Connection( int Sock )
 		Log(LOG_CRIT, "fd %d: Can't convert IP address!", new_sock);
 		Simple_Message(new_sock, "ERROR :Internal Server Error");
 		close(new_sock);
+		return -1;
 	}
 
 #ifdef TCPWRAP
@@ -1057,18 +1061,16 @@ New_Connection( int Sock )
 		return -1;
 	}
 
-	if( new_sock >= Pool_Size ) {
-		new_Pool_Size = new_sock + 1;
-		/* No free Connection Structures, check if we may accept further connections */
-		if ((( Conf_MaxConnections > 0) && Pool_Size >= Conf_MaxConnections) ||
-			(new_Pool_Size < Pool_Size))
-		{
-			Log( LOG_ALERT, "Can't accept connection: limit (%d) reached!", Pool_Size );
-			Simple_Message( new_sock, "ERROR :Connection limit reached" );
-			close( new_sock );
-			return -1;
-		}
+	if ((Conf_MaxConnections > 0) &&
+		(NumConnections >= (size_t) Conf_MaxConnections))
+	{
+		Log( LOG_ALERT, "Can't accept connection: limit (%d) reached!", Conf_MaxConnections);
+		Simple_Message( new_sock, "ERROR :Connection limit reached" );
+		close( new_sock );
+		return -1;
+	}
 
+	if( new_sock >= Pool_Size ) {
 		if (!array_alloc(&My_ConnArray, sizeof(CONNECTION),
 				 (size_t)new_sock)) {
 			Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" );
@@ -1081,7 +1083,7 @@ New_Connection( int Sock )
 
 		/* Adjust pointer to new block */
 		My_Connections = array_start(&My_ConnArray);
-		while (Pool_Size < new_Pool_Size)
+		while (Pool_Size <= new_sock)
 			Init_Conn_Struct(Pool_Size++);
 	}