node/test/parallel/test-tls-tlswrap-segfault.js
Luigi Pinca 9b7a6914a7 net: emit 'close' after 'end'
Currently the writable side of the socket is closed as soon as `UV_EOF`
is read regardless of the state of the socket. This allows the handle
to be closed before `'end'` is emitted and thus `'close'` can be
emitted before `'end'` if the socket is paused.

This commit prevents the handle from being closed until `'end'` is
emitted ensuring the correct order of events.

PR-URL: https://github.com/nodejs/node/pull/19241
Fixes: https://github.com/nodejs/node/issues/19166
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
2018-03-21 18:28:16 +01:00

43 lines
1004 B
JavaScript

'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const fixtures = require('../common/fixtures');
// This test ensures that Node.js doesn't incur a segfault while accessing
// TLSWrap fields after the parent handle was destroyed.
// https://github.com/nodejs/node/issues/5108
const assert = require('assert');
const tls = require('tls');
const options = {
key: fixtures.readKey('agent1-key.pem'),
cert: fixtures.readKey('agent1-cert.pem')
};
const server = tls.createServer(options, function(s) {
s.end('hello');
}).listen(0, function() {
const opts = {
port: this.address().port,
rejectUnauthorized: false
};
const client = tls.connect(opts, function() {
putImmediate(client);
});
client.resume();
});
function putImmediate(client) {
setImmediate(function() {
if (client.ssl) {
const fd = client.ssl.fd;
assert(!!fd);
putImmediate(client);
} else {
server.close();
}
});
}