repo: ngircd
action: commit
revision: 
path_from: 
revision_from: 04de1423eb26da60c192d343a7e7a6bcda2aca37:
path_to: 
revision_to: 
git.thebackupbox.net
ngircd
git clone git://git.thebackupbox.net/ngircd
commit 04de1423eb26da60c192d343a7e7a6bcda2aca37
Author: Michi 
Date:   Tue Apr 14 17:41:52 2020 +0200

    Fix recursion bug on write error

    Depending on the stack size, too many clients on the same channel
    quitting at the same time would trigger a crash due to too many
    recursive calls to Conn_Close().

diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index e14e6c08037aa53e57fd40825bba446313ef1b68..
index ..92d9939ab291445e53806b75609dfaa8209915ad 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -1272,6 +1272,9 @@ Handle_Write( CONN_ID Idx )
 		if (errno == EAGAIN || errno == EINTR)
 			return true;

+		/* Log write errors but do not close the connection yet.
+		 * Calling Conn_Close() now could result in too many recursive calls.
+		 */
 		if (!Conn_OPTION_ISSET(&My_Connections[Idx], CONN_ISCLOSING))
 			Log(LOG_ERR,
 			    "Write error on connection %d (socket %d): %s!",
@@ -1279,7 +1282,7 @@ Handle_Write( CONN_ID Idx )
 		else
 			LogDebug("Recursive write error on connection %d (socket %d): %s!",
 				 Idx, My_Connections[Idx].sock, strerror(errno));
-		Conn_Close(Idx, "Write error", NULL, false);
+
 		return false;
 	}

-----END OF PAGE-----