Skip to content

Commit

Permalink
tls: catch certCbDone exceptions
Browse files Browse the repository at this point in the history
Catch and emit `certCbDone` exceptions instead of throwing them as
`uncaughtException` and crashing the whole process.

Fix: #6822
PR-URL: #6887
Reviewed-By: Ben Noordhuis <[email protected]>
  • Loading branch information
indutny committed May 25, 2016
1 parent c9a5990 commit 9cac8c8
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/_tls_wrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,11 @@ function oncertcb(info) {
if (!self._handle)
return self.destroy(new Error('Socket is closed'));

self._handle.certCbDone();
try {
self._handle.certCbDone();
} catch (e) {
self.destroy(e);
}
});
});
}
Expand Down
42 changes: 42 additions & 0 deletions test/parallel/test-tls-empty-sni-context.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';

if (!process.features.tls_sni) {
console.log('1..0 # Skipped: node compiled without OpenSSL or ' +
'with old OpenSSL version.');
return;
}

const common = require('../common');
const assert = require('assert');

if (!common.hasCrypto) {
console.log('1..0 # Skipped: missing crypto');
return;
}

const tls = require('tls');

const options = {
SNICallback: (name, callback) => {
callback(null, tls.createSecureContext());
}
};

const server = tls.createServer(options, (c) => {
common.fail('Should not be called');
}).on('tlsClientError', common.mustCall((err, c) => {
assert(/SSL_use_certificate:passed a null parameter/i.test(err.message));
server.close();
})).listen(common.PORT, common.mustCall(() => {
const c = tls.connect({
port: common.PORT,
rejectUnauthorized: false,
servername: 'any.name'
}, () => {
common.fail('Should not be called');
});

c.on('error', common.mustCall((err) => {
assert(/socket hang up/.test(err.message));
}));
}));

0 comments on commit 9cac8c8

Please sign in to comment.