From e88ae156b47bbd5930e7452ee8918fab05db650a Mon Sep 17 00:00:00 2001
From: cyan <>
Date: Thu, 2 Oct 2003 23:41:58 +0000
Subject: [PATCH] The ircd would crash if a client would ping timeout.  If a
 client pings out, don't proceed to this.work()

---
 exec/ircd.js | 49 ++++++++++++++++++++++++-------------------------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/exec/ircd.js b/exec/ircd.js
index 5ef3945e89..e2222423ce 100644
--- a/exec/ircd.js
+++ b/exec/ircd.js
@@ -502,7 +502,7 @@ function create_ban_mask(str,kline) {
 }
 
 function match_irc_mask(mtchstr,mask) {
-	final_mask="^";
+	var final_mask="^";
 	mask=mask.replace(/[.]/g,"\\\.");
 	mask=mask.replace(/[?]/g,".");
 	mask=mask.replace(/[*]/g,".*?");
@@ -1005,29 +1005,26 @@ while (!server.terminated) {
 	}
 
 	// Poll all sockets for commands, then pass to the appropriate func.
-    poll_clients=new Array;
-    poll_client_map=new Array;
-    for(thisClient in Clients) {
-        ClientObject=Clients[thisClient];
-        if ( (ClientObject != undefined) &&
-             ClientObject.socket && ClientObject.conntype &&
-             ClientObject.local )
-		{
-			ClientObject.check_timeout();
-			if(this.socket_select==undefined)
-			{
+	poll_clients=new Array;
+	poll_client_map=new Array;
+	for(thisClient in Clients) {
+		var ClientObject=Clients[thisClient];
+		if ( (ClientObject != undefined) &&
+		    ClientObject.socket && ClientObject.conntype &&
+		    ClientObject.local ) {
+			if (ClientObject.check_timeout())
+				continue;
+			if(this.socket_select==undefined) {
 				ClientObject.work();
 			} else {
 				poll_clients.push(ClientObject.socket.descriptor);
 				poll_client_map.push(thisClient);
 			}
 		}
-    }
-	if(poll_clients.length && this.socket_select!=undefined)
-	{
+	}
+	if(poll_clients.length && this.socket_select!=undefined) {
 		readme=socket_select(poll_clients, 1 /* seconds */);
-		for(thisPolled in readme)
-		{
+		for(thisPolled in readme) {
 			Clients[poll_client_map[readme[thisPolled]]].work();
 		}
 	} else
@@ -1753,12 +1750,12 @@ function IRCClient_bcast_to_servers_raw(str) {
 }
 
 function IRCClient_bcast_to_uchans_unique(str) {
-	already_bcast = new Array();
+	var already_bcast = new Array();
 	for(thisChannel in this.channels) {
-		userchannel=this.channels[thisChannel];
+		var userchannel=this.channels[thisChannel];
 		if(userchannel) {
 			for (j in Channels[userchannel].users) {
-				did_i_already_broadcast = false;
+				var did_i_already_broadcast = false;
 				for (alb in already_bcast) {
 					if (already_bcast[alb] == Channels[userchannel].users[j]) {
 						did_i_already_broadcast = true;
@@ -1781,7 +1778,7 @@ function IRCClient_bcast_to_uchans_unique(str) {
 function IRCClient_bcast_to_list(chan, str, bounce, list_bit) {
 	if (chan != undefined) {
 		for (thisUser in chan.users) {
-			aUser = chan.users[thisUser];
+			var aUser = chan.users[thisUser];
 			if (aUser && ( aUser != this.id || (bounce) ) &&
 			    ( chan.ismode(aUser,list_bit) ) )
 				Clients[aUser].originatorout(str,this);
@@ -1792,10 +1789,10 @@ function IRCClient_bcast_to_list(chan, str, bounce, list_bit) {
 }
 
 function IRCClient_bcast_to_channel(chan_str, str, bounce) {
-	chan_tuc = chan_str.toUpperCase();
+	var chan_tuc = chan_str.toUpperCase();
 	if (Channels[chan_tuc] != undefined) {
 		for(thisUser in Channels[chan_tuc].users) {
-			aUser=Channels[chan_tuc].users[thisUser];
+			var aUser=Channels[chan_tuc].users[thisUser];
 			if (aUser && ( aUser != this.id || (bounce) ) &&
 			    !Clients[aUser].parent && !Clients[aUser].server ) {
 				Clients[aUser].originatorout(str,this);
@@ -1811,7 +1808,7 @@ function IRCClient_bcast_to_channel_servers(chan_str, str) {
 	var chan_tuc = chan_str.toUpperCase();
 	if (Channels[chan_tuc] != undefined) {
 		for(thisUser in Channels[chan_tuc].users) {
-			aUser=Channels[chan_tuc].users[thisUser];
+			var aUser=Channels[chan_tuc].users[thisUser];
 			if (aUser && ( Clients[aUser].parent ) &&
 			    !sent_to_servers[Clients[aUser].parent] &&
 			    (Clients[aUser].parent != this.parent) ) {
@@ -3201,7 +3198,7 @@ function IRCClient_unregistered_commands(command, cmdline) {
 				this.numeric(431, ":No nickname given.");
 				break;
 			}
-			the_nick = ircstring(cmd[1]).slice(0,max_nicklen);
+			var the_nick = ircstring(cmd[1]).slice(0,max_nicklen);
 			if (this.check_nickname(the_nick))
 				this.nick = the_nick;
 			break;
@@ -5183,11 +5180,13 @@ function IRCClient_check_timeout() {
 		if ( (this.pinged) && ((time() - this.pinged) > YLines[this.ircclass].pingfreq) ) {
 			this.pinged = false;
 			this.quit("Ping Timeout");
+			return 1; // ping timeout
 		} else if (!this.pinged && ((time() - this.idletime) > YLines[this.ircclass].pingfreq)) {
 			this.pinged = time();
 			this.rawout("PING :" + servername);
 		}
 	}
+	return 0; // no ping timeout
 }
 
 function IRCClient_work() {
-- 
GitLab