From f17b61e071a76a3789d3bb11864a6fe5c5b0e8fb Mon Sep 17 00:00:00 2001 From: David Halls Date: Thu, 13 Dec 2018 23:47:32 +0000 Subject: [PATCH] net: check for close on stream, not parent 'close' event isn't emitted on a TLS connection if it's been written to (but 'end' and 'finish' events are). PR-URL: https://github.com/nodejs/node/pull/25026 Fixes: https://github.com/nodejs/node/issues/24984 Reviewed-By: Luigi Pinca Reviewed-By: Anna Henningsen --- lib/net.js | 4 +- .../test-tls-close-event-after-write.js | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-tls-close-event-after-write.js diff --git a/lib/net.js b/lib/net.js index 3f1917c7d6b5e7..b10208ea5a02cf 100644 --- a/lib/net.js +++ b/lib/net.js @@ -362,8 +362,8 @@ Socket.prototype._final = function(cb) { }; -function afterShutdown(status, handle) { - var self = handle[owner_symbol]; +function afterShutdown(status) { + var self = this.handle[owner_symbol]; debug('afterShutdown destroyed=%j', self.destroyed, self._readableState); diff --git a/test/parallel/test-tls-close-event-after-write.js b/test/parallel/test-tls-close-event-after-write.js new file mode 100644 index 00000000000000..31ebc897b14758 --- /dev/null +++ b/test/parallel/test-tls-close-event-after-write.js @@ -0,0 +1,41 @@ +'use strict'; +const common = require('../common'); + +if (!common.hasCrypto) + common.skip('missing crypto'); + +// Issue #24984 +// 'close' event isn't emitted on a TLS connection if it's been written to +// (but 'end' and 'finish' events are). Without a fix, this test won't exit. + +const tls = require('tls'); +const fixtures = require('../common/fixtures'); +let cconn = null; +let sconn = null; + +function test() { + if (cconn && sconn) { + cconn.resume(); + sconn.resume(); + sconn.end(Buffer.alloc(1024 * 1024)); + cconn.end(); + } +} + +const server = tls.createServer({ + key: fixtures.readKey('agent1-key.pem'), + cert: fixtures.readKey('agent1-cert.pem') +}, function(c) { + c.on('close', function() { + server.close(); + }); + sconn = c; + test(); +}).listen(0, common.mustCall(function() { + tls.connect(this.address().port, { + rejectUnauthorized: false + }, common.mustCall(function() { + cconn = this; + test(); + })); +}));