commit 216eb30c73dfbdf6ba5586ed74c5b8d5d212765c from: Alexander Barton date: Tue Oct 11 19:28:47 2005 UTC Changed Handle_Write() to not close sockets itself but to call Conn_Close. commit - ff91c6db38ba2ea4bd3134e58366ebd16fa14698 commit + 216eb30c73dfbdf6ba5586ed74c5b8d5d212765c blob - 1ed41407f241336cd61fc1bd278e5e64c2eb713b blob + b10c1d55e2c41cbe094f51dd8c07755fefe22d47 --- ChangeLog +++ ChangeLog @@ -12,6 +12,8 @@ ngIRCd 0.9.x + - Fixed a bug that could cause the damon to crash when outgoing server + connections can't be established. - Fixed a bug that caused the daemon to leak file descriptors when no resolver subprocesses could be created. - Fixed server NOTICEs to users with "s" mode ("server messages"). @@ -627,4 +629,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.276.2.10 2005/09/02 22:10:58 alex Exp $ +$Id: ChangeLog,v 1.276.2.11 2005/10/11 19:28:47 alex Exp $ blob - 77e52cb69b571d2863d54243276130fd4956a900 blob + 575f283dcf153be392cdbffb55ca800210e56da1 --- src/ngircd/conf.c +++ src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.77 2005/06/17 19:16:53 fw Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.77.2.1 2005/10/11 19:28:47 alex Exp $"; #include "imp.h" #include @@ -204,6 +204,7 @@ Conf_UnsetServer( CONN_ID Idx ) * Non-Server-Connections will be silently ignored. */ int i; + time_t t; /* Check all our configured servers */ for( i = 0; i < MAX_SERVERS; i++ ) @@ -221,11 +222,14 @@ Conf_UnsetServer( CONN_ID Idx ) else { /* Set time for next connect attempt */ - if( Conf_Server[i].lasttry < time( NULL ) - Conf_ConnectRetry ) - { - /* Okay, the connection was established "long enough": */ - Conf_Server[i].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY; - } + t = time(NULL); + if (Conf_Server[i].lasttry < t - Conf_ConnectRetry) { + /* The connection has been "long", so we don't + * require the next attempt to be delayed. */ + Conf_Server[i].lasttry = + t - Conf_ConnectRetry + RECONNECT_DELAY; + } else + Conf_Server[i].lasttry = t; } } } /* Conf_UnsetServer */ blob - 258885ecc7f829a9bf06d01f2d6b81ecb5db78f8 blob + 660cca01e490f8dce57407ca6c004fdcab55a5d2 --- src/ngircd/conn.c +++ src/ngircd/conn.c @@ -16,7 +16,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.155.2.2 2005/08/25 09:04:23 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.155.2.3 2005/10/11 19:28:47 alex Exp $"; #include "imp.h" #include @@ -713,9 +713,15 @@ Conn_Close( CONN_ID Idx, char *LogMsg, char *FwdMsg, b Conn_WriteStr(Idx, "ERROR :Closing connection."); } - /* Try to write out the write buffer */ + /* Try to write out the write buffer. Note: Handle_Write() eventually + * removes the CLIENT structure associated with this connection if an + * error occurs! So we have to re-check if there is still an valid + * CLIENT structure after calling Handle_Write() ...*/ (void)Handle_Write( Idx ); + /* Search client, if any (re-check!) */ + c = Client_GetFromConn( Idx ); + /* Shut down socket */ if( close( My_Connections[Idx].sock ) != 0 ) { @@ -859,24 +865,29 @@ Handle_Write( CONN_ID Idx ) res = getsockopt( My_Connections[Idx].sock, SOL_SOCKET, SO_ERROR, &err, &sock_len ); assert( sock_len == sizeof( err )); - /* Fehler aufgetreten? */ - if(( res != 0 ) || ( err != 0 )) - { - /* Fehler! */ - if( res != 0 ) Log( LOG_CRIT, "getsockopt (connection %d): %s!", Idx, strerror( errno )); - else Log( LOG_CRIT, "Can't connect socket to \"%s:%d\" (connection %d): %s!", My_Connections[Idx].host, Conf_Server[Conf_GetServer( Idx )].port, Idx, strerror( err )); - - /* Clean up socket, connection and client structures */ - FD_CLR( My_Connections[Idx].sock, &My_Sockets ); - c = Client_GetFromConn( Idx ); - if( c ) Client_DestroyNow( c ); - close( My_Connections[Idx].sock ); - Init_Conn_Struct( Idx ); + /* Error while connecting? */ + if ((res != 0) || (err != 0)) { + if (res != 0) + Log(LOG_CRIT, "getsockopt (connection %d): %s!", + Idx, strerror(errno)); + else + Log(LOG_CRIT, + "Can't connect socket to \"%s:%d\" (connection %d): %s!", + My_Connections[Idx].host, + Conf_Server[Conf_GetServer(Idx)].port, + Idx, strerror(err)); - /* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */ - Conf_Server[Conf_GetServer( Idx )].lasttry = time( NULL ); - Conf_UnsetServer( Idx ); + /* Clean up the CLIENT structure (to avoid silly log + * messages) and call Conn_Close() to do the rest. */ + c = Client_GetFromConn(Idx); + if (c) + Client_DestroyNow(c); + Conn_Close(Idx, "Can't connect!", NULL, false); + + /* Set the timestamp of the last connect attempt */ + Conf_UnsetServer(Idx); + return false; } Log( LOG_INFO, "Connection %d with \"%s:%d\" established. Now logging in ...", Idx, My_Connections[Idx].host, Conf_Server[Conf_GetServer( Idx )].port );