From 9e01e245bfecfee45010e7623b0eb85845df8bed Mon Sep 17 00:00:00 2001 From: binlain Date: Sun, 17 Nov 2013 03:24:28 +0100 Subject: [PATCH 1/2] Use setImmediate instead of process.nextTick --- lib/socket.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/socket.js b/lib/socket.js index 8f62db7b7..12c2d945e 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -232,7 +232,7 @@ Socket.prototype.onClose = function (reason, description) { var self = this; // clean writeBuffer in next tick, so developers can still // grab the writeBuffer on 'close' event - process.nextTick(function() { + setImmediate(function() { self.writeBuffer = []; }); this.packetsFn = []; From 336e05b46139fdf12a6cdc3761ebe6eab49b547e Mon Sep 17 00:00:00 2001 From: binlain Date: Wed, 12 Feb 2014 17:17:37 +0100 Subject: [PATCH 2/2] Fix dos by possibly creating many intervals --- lib/socket.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/socket.js b/lib/socket.js index f21117048..46b9f447c 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -26,6 +26,10 @@ function Socket (id, server, transport, req) { this.packetsFn = []; this.sentCallbackFn = []; this.request = req; + + this.checkIntervalTimer = null; + this.upgradeTimeoutTimer = null; + this.pingTimeoutTimer = null; this.setTransport(transport); this.onOpen(); @@ -158,6 +162,7 @@ Socket.prototype.maybeUpgrade = function (transport) { self.upgradeTimeoutTimer = setTimeout(function () { debug('client did not complete upgrade - closing transport'); clearInterval(self.checkIntervalTimer); + self.checkIntervalTimer = null; if ('open' == transport.readyState) { transport.close(); } @@ -166,6 +171,7 @@ Socket.prototype.maybeUpgrade = function (transport) { function onPacket(packet){ if ('ping' == packet.type && 'probe' == packet.data) { transport.send([{ type: 'pong', data: 'probe' }]); + clearInterval(self.checkIntervalTimer); self.checkIntervalTimer = setInterval(check, 100); } else if ('upgrade' == packet.type && self.readyState == 'open') { debug('got upgrade packet - upgrading'); @@ -176,6 +182,7 @@ Socket.prototype.maybeUpgrade = function (transport) { self.setPingTimeout(); self.flush(); clearInterval(self.checkIntervalTimer); + self.checkIntervalTimer = null; clearTimeout(self.upgradeTimeoutTimer); transport.removeListener('packet', onPacket); } else { @@ -219,6 +226,7 @@ Socket.prototype.onClose = function (reason, description) { if ('closed' != this.readyState) { clearTimeout(this.pingTimeoutTimer); clearInterval(this.checkIntervalTimer); + this.checkIntervalTimer = null; clearTimeout(this.upgradeTimeoutTimer); var self = this; // clean writeBuffer in next tick, so developers can still