summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2018-05-13 23:38:07 +0200
committerAnatoli Papirovski <apapirovski@mac.com>2018-05-16 08:59:37 +0400
commitde4e0d7f6d2a52452043ffdcf13a6a3ce8f31091 (patch)
tree38fd324058a2112dac3af5126ca2467122cd116b /test
parent9e4ae56cc7a81e299850c2525f8b1c071fabc6e6 (diff)
downloadandroid-node-v8-de4e0d7f6d2a52452043ffdcf13a6a3ce8f31091.tar.gz
android-node-v8-de4e0d7f6d2a52452043ffdcf13a6a3ce8f31091.tar.bz2
android-node-v8-de4e0d7f6d2a52452043ffdcf13a6a3ce8f31091.zip
src: handle TryCatch with empty message
This bug needs a test case with a high goldilocks factor to trigger but the synopsis is that `v8::TryCatch::Message()` returns an empty handle when the TryCatch is declared at a time when an exception is already pending. We now recompute the message inside `node::ReportException()` and all is well again. PR-URL: https://github.com/nodejs/node/pull/20708 Fixes: https://github.com/nodejs/node/issues/8854 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-tls-handshake-exception.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/test/parallel/test-tls-handshake-exception.js b/test/parallel/test-tls-handshake-exception.js
new file mode 100644
index 0000000000..1ba4bc6438
--- /dev/null
+++ b/test/parallel/test-tls-handshake-exception.js
@@ -0,0 +1,57 @@
+'use strict';
+
+// Verify that exceptions from a callback don't result in
+// failed CHECKs when trying to print the exception message.
+
+// This test is convoluted because it needs to trigger a callback
+// into JS land at just the right time when an exception is pending,
+// and does so by exploiting a weakness in the streams infrastructure.
+// I won't shed any tears if this test ever becomes invalidated.
+
+const common = require('../common');
+
+if (!common.hasCrypto)
+ common.skip('missing crypto');
+
+if (process.argv[2] === 'child') {
+ const fixtures = require('../common/fixtures');
+ const https = require('https');
+ const net = require('net');
+ const tls = require('tls');
+ const { Duplex } = require('stream');
+ const { mustCall } = common;
+
+ const cert = fixtures.readSync('test_cert.pem');
+ const key = fixtures.readSync('test_key.pem');
+
+ net.createServer(mustCall(onplaintext)).listen(0, mustCall(onlisten));
+
+ function onlisten() {
+ const { port } = this.address();
+ https.get({ port, rejectUnauthorized: false });
+ }
+
+ function onplaintext(c) {
+ const d = new class extends Duplex {
+ _read(n) {
+ const data = c.read(n);
+ if (data) d.push(data);
+ }
+ _write(...xs) {
+ c.write(...xs);
+ }
+ }();
+ c.on('data', d.push.bind(d));
+
+ const options = { key, cert };
+ const fail = () => { throw new Error('eyecatcher'); };
+ tls.createServer(options, mustCall(fail)).emit('connection', d);
+ }
+} else {
+ const assert = require('assert');
+ const { spawnSync } = require('child_process');
+ const result = spawnSync(process.execPath, [__filename, 'child']);
+ const stderr = result.stderr.toString();
+ const ok = stderr.includes('Error: eyecatcher');
+ assert(ok, stderr);
+}