From 1e386fb7acdf6754a9ee4e6ddc8fa7180f6e5c1e Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sun, 13 Dec 2015 21:56:07 +0100 Subject: [PATCH] Make NJOIN handler more fault-tolerant Don't crash the daemon when the NJOIN handler can't join the new client to a channel (when the Channel_Join() function failed) but try to KILL this client -- which is the only possible reaction besides crashing: otherwise the network would get out of sync. --- src/ngircd/irc-server.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ngircd/irc-server.c b/src/ngircd/irc-server.c index 6ca3c332..86d97a2f 100644 --- a/src/ngircd/irc-server.c +++ b/src/ngircd/irc-server.c @@ -31,6 +31,7 @@ #include "parse.h" #include "numeric.h" #include "ngircd.h" +#include "irc.h" #include "irc-info.h" #include "irc-write.h" #include "op.h" @@ -282,7 +283,16 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req ) goto skip_njoin; } - Channel_Join(c, channame); + if (Channel_Join(c, channame)) { + /* Failed to join channel. Ooops!? */ + Log(LOG_ALERT, + "Failed to join client \"%s\" to channel \"%s\" (NJOIN): killing it!", + ptr, channame); + IRC_KillClient(NULL, NULL, ptr, "Internal NJOIN error!"); + Log(LOG_DEBUG, "... done."); + goto skip_njoin; + } + chan = Channel_Search(channame); assert(chan != NULL); -- 2.39.2