mirror of
https://github.com/nodejs/node.git
synced 2025-05-17 12:08:20 +00:00

The TLSWrap constructor is passed a StreamBase* which it stores as
TLSWrap::stream_, and is used to receive/send data along the pipeline
(e.g. tls -> tcp). Problem is the lifetime of the instance that stream_
points to is independent of the lifetime of the TLSWrap instance. So
it's possible for stream_ to be delete'd while the TLSWrap instance is
still alive, allowing potential access to a then invalid pointer.
Fix by having the StreamBase destructor null out TLSWrap::stream_;
allowing all TLSWrap methods that rely on stream_ to do a check to see
if it's available.
While the test provided is fixed by this commit, it was also previously
fixed by 478fabf
. Regardless, leave the test in for better testing.
PR-URL: https://github.com/nodejs/node/pull/11947
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
43 lines
957 B
JavaScript
43 lines
957 B
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
|
|
if (!common.hasCrypto) {
|
|
common.skip('missing crypto');
|
|
return;
|
|
}
|
|
const tls = require('tls');
|
|
const fs = require('fs');
|
|
const util = require('util');
|
|
|
|
const sent = 'hello world';
|
|
const serverOptions = {
|
|
isServer: true,
|
|
key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'),
|
|
cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem')
|
|
};
|
|
|
|
let ssl = null;
|
|
|
|
process.on('exit', function() {
|
|
assert.ok(ssl !== null);
|
|
// If the internal pointer to stream_ isn't cleared properly then this
|
|
// will abort.
|
|
util.inspect(ssl);
|
|
});
|
|
|
|
const server = tls.createServer(serverOptions, function(s) {
|
|
s.on('data', function() { });
|
|
s.on('end', function() {
|
|
server.close();
|
|
s.destroy();
|
|
});
|
|
}).listen(0, function() {
|
|
const c = new tls.TLSSocket();
|
|
ssl = c.ssl;
|
|
c.connect(this.address().port, function() {
|
|
c.end(sent);
|
|
});
|
|
});
|