Skip to content

Commit eb35968

Browse files
committed
crypto: fix legacy SNICallback
`onselect` is set on the `sniObject_` not on the `Connection` instance. See: nodejs/node-v0.x-archive#25109 PR-URL: #1720 Reviewed-By: Ben Noordhuis <[email protected]>
1 parent 9afee67 commit eb35968

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

src/node_crypto.cc

+8-1
Original file line numberDiff line numberDiff line change
@@ -2346,8 +2346,15 @@ int Connection::SelectSNIContextCallback_(SSL *s, int *ad, void* arg) {
23462346
if (!conn->sniObject_.IsEmpty()) {
23472347
conn->sni_context_.Reset();
23482348

2349+
Local<Object> sni_obj = PersistentToLocal(env->isolate(),
2350+
conn->sniObject_);
2351+
23492352
Local<Value> arg = PersistentToLocal(env->isolate(), conn->servername_);
2350-
Local<Value> ret = conn->MakeCallback(env->onselect_string(), 1, &arg);
2353+
Local<Value> ret = node::MakeCallback(env->isolate(),
2354+
sni_obj,
2355+
env->onselect_string(),
2356+
1,
2357+
&arg);
23512358

23522359
// If ret is SecureContext
23532360
Local<FunctionTemplate> secure_context_constructor_template =
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
var common = require('../common');
3+
var assert = require('assert');
4+
5+
if (!common.hasCrypto) {
6+
console.log('1..0 # Skipped: missing crypto');
7+
return;
8+
}
9+
var tls = require('tls');
10+
var net = require('net');
11+
12+
var fs = require('fs');
13+
14+
var success = false;
15+
16+
function filenamePEM(n) {
17+
return require('path').join(common.fixturesDir, 'keys', n + '.pem');
18+
}
19+
20+
function loadPEM(n) {
21+
return fs.readFileSync(filenamePEM(n));
22+
}
23+
24+
var server = net.Server(function(raw) {
25+
var pair = tls.createSecurePair(null, true, false, false);
26+
pair.on('error', function() {});
27+
pair.ssl.setSNICallback(function() {
28+
raw.destroy();
29+
server.close();
30+
success = true;
31+
});
32+
require('_tls_legacy').pipe(pair, raw);
33+
}).listen(common.PORT, function() {
34+
tls.connect({
35+
port: common.PORT,
36+
rejectUnauthorized: false,
37+
servername: 'server'
38+
}, function() {
39+
}).on('error', function() {
40+
// Just ignore
41+
});
42+
});
43+
process.on('exit', function() {
44+
assert(success);
45+
});

0 commit comments

Comments
 (0)