mirror of
https://github.com/osmarks/ngircd.git
synced 2024-12-12 09:50:29 +00:00
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.
This commit is contained in:
parent
2c2c93e311
commit
c997e04325
@ -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++);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user