Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

The net.js client does not release the socket on DNS errors #2688

Closed
wants to merge 2 commits into from

3 participants

@SaltwaterC

Which means that the socket stays there forever and the event loop waits for a connection that is not going to happen. The http.js client is patched against this behavior, but the issue lies within net.js.

A simple script to reproduce it:

var net = require('net');
var socket = net.connect(80, '.foo.bar', function () {
  console.log('connected');
  socket.destroy();
});
socket.on('error', function (err) {
  console.error(err);
});

The result is simple: the process hangs.

This small patch makes sure of that it is destroyed when the deferred error event is sent. Also added a specific test for this issue. I also corrected the http-dns-error error test that didn't test the https.js specifically because this bug.

@defunctzombie

+1 LGTM

@bnoordhuis

Thanks Stefan, merged in 4671e54 and 07a983a.

@bnoordhuis bnoordhuis closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 3, 2012
  1. @SaltwaterC
  2. @SaltwaterC

    test: net-dns-error: specifc test for the net DNS issue. http-dns-err…

    SaltwaterC authored
    …or: now it works for HTTPS as well.
This page is out of date. Refresh to see the latest.
View
1  lib/net.js
@@ -604,6 +604,7 @@ Socket.prototype.connect = function(options, cb) {
// error event to the next tick.
process.nextTick(function() {
self.emit('error', err);
+ self.destroy();
});
} else {
timers.active(self);
View
5 test/simple/test-http-dns-error.js
@@ -59,10 +59,7 @@ function test(mod) {
req.end();
}
-// FIXME This doesn't work for https because the tls module won't emit errors
-// until a secure channel has been established - and that is never going to
-// happen because the host name is invalid.
-//test(https);
+test(https);
test(http);
process.on('exit', function() {
View
48 test/simple/test-net-dns-error.js
@@ -0,0 +1,48 @@
+// 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 assert = require('assert');
+
+var net = require('net');
+
+var expected_bad_connections = 1;
+var actual_bad_connections = 0;
+
+var host = '********';
+host += host;
+host += host;
+host += host;
+host += host;
+host += host;
+
+function do_not_call() {
+ throw new Error('This function should not have been called.');
+}
+
+var socket = net.connect(42, host, do_not_call);
+socket.on('error', function (err) {
+ assert.equal(err.code, 'ENOTFOUND');
+ actual_bad_connections++;
+});
+
+process.on('exit', function() {
+ assert.equal(actual_bad_connections, expected_bad_connections);
+});
Something went wrong with that request. Please try again.