Browse Source

tls: catch `certCbDone` exceptions

Catch and emit `certCbDone` exceptions instead of throwing them as
`uncaughtException` and crashing the whole process.

Fix: https://github.com/nodejs/node/issues/6822
PR-URL: https://github.com/nodejs/node/pull/6887
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
v6.x
Fedor Indutny 9 years ago
committed by Rod Vagg
parent
commit
21e31352d7
  1. 6
      lib/_tls_wrap.js
  2. 42
      test/parallel/test-tls-empty-sni-context.js

6
lib/_tls_wrap.js

@ -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);
}
});
});
}

42
test/parallel/test-tls-empty-sni-context.js

@ -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));
}));
}));
Loading…
Cancel
Save