summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorTrevor Norris <trev.norris@gmail.com>2016-10-31 16:48:14 -0600
committerAnna Henningsen <anna@addaleax.net>2017-03-27 02:20:59 +0200
commitee463d335e05a6656001697152ee7ec056eb209b (patch)
tree414ef74abc7ef68f0ab517e4b851f7bf1ed457df /test
parent0db49fef4152e3642c2a0686c30bf59813e7ce1c (diff)
downloadandroid-node-v8-ee463d335e05a6656001697152ee7ec056eb209b.tar.gz
android-node-v8-ee463d335e05a6656001697152ee7ec056eb209b.tar.bz2
android-node-v8-ee463d335e05a6656001697152ee7ec056eb209b.zip
stream_base,tls_wrap: notify on destruct
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>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-tls-retain-handle-no-abort.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/parallel/test-tls-retain-handle-no-abort.js b/test/parallel/test-tls-retain-handle-no-abort.js
new file mode 100644
index 0000000000..43b3709fd5
--- /dev/null
+++ b/test/parallel/test-tls-retain-handle-no-abort.js
@@ -0,0 +1,42 @@
+'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);
+ });
+});