diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index 544fe95206f..b39cdb9a35c 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -359,7 +359,6 @@ TLSSocket.prototype._init = function(socket, wrap) { ssl.onerror = function(err) { if (self._writableState.errorEmitted) return; - self._writableState.errorEmitted = true; // Destroy socket if error happened before handshake's finish if (!self._secureEstablished) { @@ -373,6 +372,8 @@ TLSSocket.prototype._init = function(socket, wrap) { // Throw error self._emitTLSError(err); } + + self._writableState.errorEmitted = true; }; // If custom SNICallback was given, or if diff --git a/test/parallel/test-tls-handshake-error.js b/test/parallel/test-tls-handshake-error.js new file mode 100644 index 00000000000..dbe91d0943c --- /dev/null +++ b/test/parallel/test-tls-handshake-error.js @@ -0,0 +1,46 @@ +'use strict'; + +var assert = require('assert'); +var common = require('../common'); + +if (!common.hasCrypto) { + console.log('1..0 # Skipped: missing crypto'); + process.exit(); +} +var tls = require('tls'); + +var fs = require('fs'); +var net = require('net'); + +var errorCount = 0; +var closeCount = 0; + +var server = tls.createServer({ + key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'), + cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem'), + rejectUnauthorized: true +}, function(c) { +}).listen(common.PORT, function() { + var c = tls.connect({ + port: common.PORT, + ciphers: 'RC4' + }, function() { + assert(false, 'should not be called'); + }); + + c.on('error', function(err) { + errorCount++; + assert.notEqual(err.code, 'ECONNRESET'); + }); + + c.on('close', function(err) { + if (err) + closeCount++; + server.close(); + }); +}); + +process.on('exit', function() { + assert.equal(errorCount, 1); + assert.equal(closeCount, 1); +});