tls: fix session and keylog add listener segfault

Fix an issue where adding a session or keylog listener on a tlsSocket
after it was destroyed caused a segfault.

fixes: https://github.com/nodejs/node/issues/38133
fixes: https://github.com/nodejs/node/issues/38135

PR-URL: https://github.com/nodejs/node/pull/38180
Fixes: https://github.com/nodejs/node/issues/38133
Fixes: https://github.com/nodejs/node/issues/38135
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Nitzan Uziely 2021-04-10 02:07:56 +03:00 committed by James M Snell
parent 0180fc5b9b
commit 3da003cc1c
No known key found for this signature in database
GPG Key ID: 7341B15C070877AC
2 changed files with 28 additions and 2 deletions

View File

@ -689,7 +689,9 @@ TLSSocket.prototype._init = function(socket, wrap) {
if (event !== 'keylog')
return;
ssl.enableKeylogCallback();
// Guard against enableKeylogCallback after destroy
if (!this._handle) return;
this._handle.enableKeylogCallback();
// Remove this listener since it's no longer needed.
this.removeListener('newListener', keylogNewListener);
@ -733,7 +735,9 @@ TLSSocket.prototype._init = function(socket, wrap) {
if (event !== 'session')
return;
ssl.enableSessionCallbacks();
// Guard against enableSessionCallbacks after destroy
if (!this._handle) return;
this._handle.enableSessionCallbacks();
// Remove this listener since it's no longer needed.
this.removeListener('newListener', newListener);

View File

@ -0,0 +1,22 @@
'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
// This test ensures that Node.js doesn't incur a segfault while
// adding session or keylog listeners after destroy.
// https://github.com/nodejs/node/issues/38133
// https://github.com/nodejs/node/issues/38135
const tls = require('tls');
const tlsSocketKeyLog = tls.connect('cause-error');
tlsSocketKeyLog.on('error', common.mustCall());
tlsSocketKeyLog.on('close', common.mustCall(() => {
tlsSocketKeyLog.on('keylog', common.mustNotCall());
}));
const tlsSocketSession = tls.connect('cause-error-2');
tlsSocketSession.on('error', common.mustCall());
tlsSocketSession.on('close', common.mustCall(() => {
tlsSocketSession.on('session', common.mustNotCall());
}));