From eb35968de7a040d737f3280e9fed0b6edf566b2b Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Sun, 17 May 2015 15:10:24 +0200 Subject: [PATCH] crypto: fix legacy SNICallback `onselect` is set on the `sniObject_` not on the `Connection` instance. See: https://github.com/joyent/node/pull/25109 PR-URL: https://github.com/nodejs/io.js/pull/1720 Reviewed-By: Ben Noordhuis --- src/node_crypto.cc | 9 ++++- test/parallel/test-tls-legacy-onselect.js | 45 +++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-tls-legacy-onselect.js diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 915ba05d06a575..ba71eb73facfd0 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -2346,8 +2346,15 @@ int Connection::SelectSNIContextCallback_(SSL *s, int *ad, void* arg) { if (!conn->sniObject_.IsEmpty()) { conn->sni_context_.Reset(); + Local sni_obj = PersistentToLocal(env->isolate(), + conn->sniObject_); + Local arg = PersistentToLocal(env->isolate(), conn->servername_); - Local ret = conn->MakeCallback(env->onselect_string(), 1, &arg); + Local ret = node::MakeCallback(env->isolate(), + sni_obj, + env->onselect_string(), + 1, + &arg); // If ret is SecureContext Local secure_context_constructor_template = diff --git a/test/parallel/test-tls-legacy-onselect.js b/test/parallel/test-tls-legacy-onselect.js new file mode 100644 index 00000000000000..6f1e9a91a8344c --- /dev/null +++ b/test/parallel/test-tls-legacy-onselect.js @@ -0,0 +1,45 @@ +'use strict'; +var common = require('../common'); +var assert = require('assert'); + +if (!common.hasCrypto) { + console.log('1..0 # Skipped: missing crypto'); + return; +} +var tls = require('tls'); +var net = require('net'); + +var fs = require('fs'); + +var success = false; + +function filenamePEM(n) { + return require('path').join(common.fixturesDir, 'keys', n + '.pem'); +} + +function loadPEM(n) { + return fs.readFileSync(filenamePEM(n)); +} + +var server = net.Server(function(raw) { + var pair = tls.createSecurePair(null, true, false, false); + pair.on('error', function() {}); + pair.ssl.setSNICallback(function() { + raw.destroy(); + server.close(); + success = true; + }); + require('_tls_legacy').pipe(pair, raw); +}).listen(common.PORT, function() { + tls.connect({ + port: common.PORT, + rejectUnauthorized: false, + servername: 'server' + }, function() { + }).on('error', function() { + // Just ignore + }); +}); +process.on('exit', function() { + assert(success); +});