From: Alexander Barton Date: Mon, 17 Jan 2005 11:57:39 +0000 (+0000) Subject: Fixed a memory leak when resizing the connection pool and realloc() failed. X-Git-Tag: rel-0-9-0-pre1~135 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=commitdiff_plain;h=429b5f3ec9914a512708d1a718a9e40476a6c623 Fixed a memory leak when resizing the connection pool and realloc() failed. Now we don't fall back to malloc(), which should be sane anyway. Patch from Florian Westphal, . --- diff --git a/ChangeLog b/ChangeLog index c5b9ddcd..1162c9d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,9 @@ ngIRCd CVSHEAD + - Fixed a memory leak when resizing the connection pool and realloc() + failed. Now we don't fall back to malloc(), which should be sane anyway. + Patch from Florian Westphal, . - Added support for the Howl (http://www.porchdogsoft.com/products/howl/) Rendezvous API, in addition to the API of Apple (Mac OS X). The available APU will be autodetected when you call "./configure --with-rendezvous". @@ -553,4 +556,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.248 2004/12/26 00:14:33 alex Exp $ +$Id: ChangeLog,v 1.249 2005/01/17 11:57:39 alex Exp $ diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index f0bf5f08..aad61494 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -16,7 +16,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.141 2004/12/22 17:37:41 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.142 2005/01/17 11:57:39 alex Exp $"; #include "imp.h" #include @@ -1012,32 +1012,17 @@ New_Connection( INT Sock ) return; } - /* zunaechst realloc() versuchen; wenn das scheitert, malloc() versuchen - * und Daten ggf. "haendisch" umkopieren. (Haesslich! Eine wirklich - * dynamische Verwaltung waere wohl _deutlich_ besser ...) */ ptr = (POINTER *)realloc( My_Connections, sizeof( CONNECTION ) * new_size ); if( ! ptr ) { - /* realloc() ist fehlgeschlagen. Nun malloc() probieren: */ - ptr = (POINTER *)malloc( sizeof( CONNECTION ) * new_size ); - if( ! ptr ) - { - /* Offenbar steht kein weiterer Sepeicher zur Verfuegung :-( */ - Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" ); - Simple_Message( new_sock, "ERROR: Internal error" ); - close( new_sock ); - return; - } - - /* Struktur umkopieren ... */ - memcpy( ptr, My_Connections, sizeof( CONNECTION ) * Pool_Size ); - -#ifdef DEBUG - Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [malloc()/memcpy()]", new_size, sizeof( CONNECTION ) * new_size ); -#endif + Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" ); + Simple_Message( new_sock, "ERROR: Internal error" ); + close( new_sock ); + return; } + #ifdef DEBUG - else Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [realloc()]", new_size, sizeof( CONNECTION ) * new_size ); + Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [realloc()]", new_size, sizeof( CONNECTION ) * new_size ); #endif /* Adjust pointer to new block */