From: Alexander Barton Date: Sun, 9 Mar 2003 20:16:46 +0000 (+0000) Subject: ngIRCd now handles recursive calls to Conn_Close() correctly (from HEAD). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb8ed9d5da5f5f34333e970009a5968be5cbe972;p=ngircd ngIRCd now handles recursive calls to Conn_Close() correctly (from HEAD). --- diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index bc2ccbdc..f1bdd1cf 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.106 2002/12/18 13:50:22 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.106.2.1 2003/03/09 20:16:46 alex Exp $"; #include "imp.h" #include @@ -574,6 +574,18 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) assert( Idx > NONE ); assert( My_Connections[Idx].sock > NONE ); + /* Is this link already shutting down? */ + if( My_Connections[Idx].options & CONN_ISCLOSING ) + { + /* Conn_Close() has been called recursively for this link; + * probabe reason: Try_Write() failed -- see below. */ + return; + } + + /* Mark link as "closing" */ + My_Connections[Idx].options |= CONN_ISCLOSING; + + /* Search client, if any */ c = Client_GetFromConn( Idx ); if( InformClient ) @@ -592,9 +604,8 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) if( My_Connections[Idx].sock == NONE ) return; } - /* zunaechst versuchen, noch im Schreibpuffer vorhandene - * Daten auf den Socket zu schreiben ... */ - Try_Write( Idx ); + /* Try to write out the write buffer */ + (VOID)Try_Write( Idx ); if( close( My_Connections[Idx].sock ) != 0 ) { diff --git a/src/ngircd/conn.h b/src/ngircd/conn.h index b9812156..f3bd43fc 100644 --- a/src/ngircd/conn.h +++ b/src/ngircd/conn.h @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conn.h,v 1.26 2002/12/18 13:50:22 alex Exp $ + * $Id: conn.h,v 1.26.2.1 2003/03/09 20:16:46 alex Exp $ * * Connection management (header) */ @@ -18,11 +18,13 @@ #define __conn_h__ -#include /* wg. time_t, s.u. */ +#include /* fro time_t, see below */ +#define CONN_ISCLOSING 1 /* Conn_Close() already called */ + #ifdef USE_ZLIB -#define CONN_ZIP 4 /* Kompression mit zlib */ +#define CONN_ZIP 2 /* zlib compressed link */ #endif