From: Ben Noordhuis Date: Thu, 1 Dec 2011 13:51:53 +0000 (+0100) Subject: net: don't emit 'close' event twice X-Git-Tag: v0.6.4~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=03eb41c2ec4e99c52a5338ecd021056d065ddaab;p=platform%2Fupstream%2Fnodejs.git net: don't emit 'close' event twice Don't allow `socket.destroy()` to run twice. The self-destruct sequence itself is idempotent but it makes the 'close' and 'error' events fire more than once, which may confuse listeners. Fixes #2223. --- diff --git a/lib/net.js b/lib/net.js index c1d09ee..c11189e 100644 --- a/lib/net.js +++ b/lib/net.js @@ -273,6 +273,8 @@ Socket.prototype._connectQueueCleanUp = function(exception) { Socket.prototype.destroy = function(exception) { + if (this.destroyed) return; + var self = this; self._connectQueueCleanUp(); @@ -283,7 +285,7 @@ Socket.prototype.destroy = function(exception) { timers.unenroll(this); - if (this.server && !this.destroyed) { + if (this.server) { this.server.connections--; this.server._emitCloseIfDrained(); } diff --git a/test/simple/test-net-socket-destroy-twice.js b/test/simple/test-net-socket-destroy-twice.js new file mode 100644 index 0000000..882e3a1 --- /dev/null +++ b/test/simple/test-net-socket-destroy-twice.js @@ -0,0 +1,43 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var common = require('../common'); +var assert = require('assert'); +var net = require('net'); + +var nerrors = 0; +var ncloses = 0; + +process.on('exit', function() { + assert.equal(nerrors, 1); + assert.equal(ncloses, 1); +}); + +var conn = net.createConnection(common.PORT); + +conn.on('error', function() { + nerrors++; + conn.destroy(); +}); + +conn.on('close', function() { + ncloses++; +});