]> arthur.barton.de Git - ngircd.git/commitdiff
Fix recursion bug on write error
authormichi <michi+ngircd@dataswamp.org>
Tue, 14 Apr 2020 15:41:52 +0000 (17:41 +0200)
committerAlexander Barton <alex@barton.de>
Sun, 19 Apr 2020 22:20:46 +0000 (00:20 +0200)
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().

src/ngircd/conn.c

index e14e6c08037aa53e57fd40825bba446313ef1b68..92d9939ab291445e53806b75609dfaa8209915ad 100644 (file)
@@ -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;
        }