diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index ca5933c8abb8c9..2077bf0846314f 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -313,6 +313,9 @@ proxiedMethods.forEach(function(name) { }); tls_wrap.TLSWrap.prototype.close = function closeProxy(cb) { + if (this.owner) + this.owner.ssl = null; + if (this._parentWrap && this._parentWrap._handle === this._parent) { this._parentWrap.once('close', cb); return this._parentWrap.destroy(); diff --git a/test/parallel/test-tls-regr-gh-5108.js b/test/parallel/test-tls-regr-gh-5108.js new file mode 100644 index 00000000000000..5efcb76eab9c7f --- /dev/null +++ b/test/parallel/test-tls-regr-gh-5108.js @@ -0,0 +1,42 @@ +'use strict'; +const common = require('../common'); + +if (!common.hasCrypto) { + console.log('1..0 # Skipped: missing crypto'); + return; +} + +const assert = require('assert'); +const tls = require('tls'); +const fs = require('fs'); + +const options = { + key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'), + cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem') +}; + + +const server = tls.createServer(options, function(s) { + s.end('hello'); +}).listen(common.PORT, function() { + const opts = { + port: common.PORT, + rejectUnauthorized: false + }; + const client = tls.connect(opts, function() { + putImmediate(client); + }); +}); + + +function putImmediate(client) { + setImmediate(function() { + if (client.ssl) { + const fd = client.ssl.fd; + assert(!!fd); + putImmediate(client); + } else { + server.close(); + } + }); +}