repo: ngircd action: commit revision: path_from: revision_from: 1e386fb7acdf6754a9ee4e6ddc8fa7180f6e5c1e: path_to: revision_to:
commit 1e386fb7acdf6754a9ee4e6ddc8fa7180f6e5c1e Author: Alexander BartonDate: Sun Dec 13 21:56:07 2015 +0100 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. diff --git a/src/ngircd/irc-server.c b/src/ngircd/irc-server.c
--- 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);
-----END OF PAGE-----