diff --git a/lib/net.js b/lib/net.js index efaf8165a9..c057eeb275 100644 --- a/lib/net.js +++ b/lib/net.js @@ -1020,6 +1020,7 @@ Server.prototype._doListen = function() { try { bind(self.fd, arguments[0], arguments[1]); } catch (err) { + self.close(); self.emit('error', err); return; } @@ -1035,6 +1036,7 @@ Server.prototype._doListen = function() { try { listen(self.fd, self._backlog || 128); } catch (err) { + self.close(); self.emit('error', err); return; } diff --git a/test/simple/test-net-server-try-ports.js b/test/simple/test-net-server-try-ports.js new file mode 100644 index 0000000000..91b8982a0c --- /dev/null +++ b/test/simple/test-net-server-try-ports.js @@ -0,0 +1,55 @@ +// This tests binds to one port, then attempts to start a server on that +// port. It should be EADDRINUSE but be able to then bind to another port. +var common = require('../common'); +var assert = require('assert'); +var net = require('net'); + +var connections = 0; + +var server1listening = false; +var server2listening = false; + +var server1 = net.Server(function (socket) { + connections++; + socket.destroy(); +}); + +var server2 = net.Server(function (socket) { + connections++; + socket.destroy(); +}); + +var server2errors = 0; +server2.on('error', function() { + server2errors++; + console.error("server2 error"); +}); + + +server1.listen(common.PORT, function () { + console.error("server1 listening"); + server1listening = true; + // This should make server2 emit EADDRINUSE + server2.listen(common.PORT); + + // Wait a bit, now try again. + // TODO, the listen callback should report if there was an error. + // Then we could avoid this very unlikely but potential race condition + // here. + setTimeout(function() { + server2.listen(common.PORT + 1, function () { + console.error("server2 listening"); + server2listening = true; + + server1.close(); + server2.close(); + }); + }, 100); +}); + + +process.on('exit', function() { + assert.equal(1, server2errors); + assert.ok(server2listening); + assert.ok(server1listening); +});