diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-29 20:36:59 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-29 20:36:59 +0000 |
commit | 6ee7fcf3097d82ee134f8a7a549d7244ac0a0a26 (patch) | |
tree | 08e696e6198352cd923f3981812cf0ca1a11b1fe | |
parent | 0e0c793e2e91ba4c354e6ad0e72cba921240284a (diff) |
merge revision(s) 54258: [Backport #12182]
* ext/openssl/extconf.rb: check SSL_CTX_set_next_proto_select_cb
function rather than OPENSSL_NPN_NEGOTIATED macro. it exists
even if it is disabled by OpenSSL configuration.
[ruby-core:74384] [Bug #12182]
* ext/openssl/ossl_ssl.c: update #ifdef(s) as above.
* test/openssl/test_ssl.rb: skip NPN tests if NPN is disabled.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@54428 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | ext/openssl/extconf.rb | 2 | ||||
-rw-r--r-- | ext/openssl/ossl_ssl.c | 37 | ||||
-rw-r--r-- | test/openssl/test_ssl.rb | 4 | ||||
-rw-r--r-- | version.h | 2 |
5 files changed, 35 insertions, 21 deletions
@@ -1,3 +1,14 @@ +Wed Mar 30 05:15:04 2016 Kazuki Yamaguchi <k@rhe.jp> + + * ext/openssl/extconf.rb: check SSL_CTX_set_next_proto_select_cb + function rather than OPENSSL_NPN_NEGOTIATED macro. it exists + even if it is disabled by OpenSSL configuration. + [ruby-core:74384] [Bug #12182] + + * ext/openssl/ossl_ssl.c: update #ifdef(s) as above. + + * test/openssl/test_ssl.rb: skip NPN tests if NPN is disabled. + Wed Mar 30 05:13:25 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/uri/http.rb (URI::HTTP#initialize): [DOC] fix example, diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb index fad562bf87..bfef82dd6e 100644 --- a/ext/openssl/extconf.rb +++ b/ext/openssl/extconf.rb @@ -112,7 +112,7 @@ have_func("TLSv1_1_client_method") have_func("TLSv1_2_method") have_func("TLSv1_2_server_method") have_func("TLSv1_2_client_method") -have_macro("OPENSSL_NPN_NEGOTIATED", ['openssl/ssl.h']) && $defs.push("-DHAVE_OPENSSL_NPN_NEGOTIATED") +have_func("SSL_CTX_set_next_proto_select_cb") unless have_func("SSL_set_tlsext_host_name", ['openssl/ssl.h']) have_macro("SSL_set_tlsext_host_name", ['openssl/ssl.h']) && $defs.push("-DHAVE_SSL_SET_TLSEXT_HOST_NAME") end diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 82e194a68d..6857b353f5 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -585,7 +585,7 @@ ssl_renegotiation_cb(const SSL *ssl) (void) rb_funcall(cb, rb_intern("call"), 1, ssl_obj); } -#ifdef HAVE_OPENSSL_NPN_NEGOTIATED +#if defined(HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB) || defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB) static VALUE ssl_npn_encode_protocol_i(VALUE cur, VALUE encoded) { @@ -610,18 +610,6 @@ ssl_npn_encode_protocols(VALUE sslctx, VALUE protocols) } static int -ssl_npn_advertise_cb(SSL *ssl, const unsigned char **out, unsigned int *outlen, void *arg) -{ - VALUE sslctx_obj = (VALUE) arg; - VALUE protocols = rb_iv_get(sslctx_obj, "@_protocols"); - - *out = (const unsigned char *) RSTRING_PTR(protocols); - *outlen = RSTRING_LENINT(protocols); - - return SSL_TLSEXT_ERR_OK; -} - -static int ssl_npn_select_cb_common(VALUE cb, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen) { VALUE selected; @@ -653,6 +641,19 @@ ssl_npn_select_cb_common(VALUE cb, const unsigned char **out, unsigned char *out return SSL_TLSEXT_ERR_OK; } +#ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB +static int +ssl_npn_advertise_cb(SSL *ssl, const unsigned char **out, unsigned int *outlen, void *arg) +{ + VALUE sslctx_obj = (VALUE) arg; + VALUE protocols = rb_iv_get(sslctx_obj, "@_protocols"); + + *out = (const unsigned char *) RSTRING_PTR(protocols); + *outlen = RSTRING_LENINT(protocols); + + return SSL_TLSEXT_ERR_OK; +} + static int ssl_npn_select_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg) { @@ -663,8 +664,8 @@ ssl_npn_select_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsi return ssl_npn_select_cb_common(cb, (const unsigned char **)out, outlen, in, inlen); } - #endif +#endif /* HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB || HAVE_SSL_CTX_SET_ALPN_SELECT_CB */ /* This function may serve as the entry point to support further * callbacks. */ @@ -797,7 +798,7 @@ ossl_sslctx_setup(VALUE self) SSL_CTX_set_options(ctx, SSL_OP_ALL); } -#ifdef HAVE_OPENSSL_NPN_NEGOTIATED +#ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB val = rb_iv_get(self, "@npn_protocols"); if (!NIL_P(val)) { ssl_npn_encode_protocols(self, val); @@ -1878,7 +1879,7 @@ ossl_ssl_get_client_ca_list(VALUE self) return ossl_x509name_sk2ary(ca); } -# ifdef HAVE_OPENSSL_NPN_NEGOTIATED +# ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB /* * call-seq: * ssl.npn_protocol => String @@ -2120,7 +2121,7 @@ Init_ossl_ssl(void) * end */ rb_attr(cSSLContext, rb_intern("renegotiation_cb"), 1, 1, Qfalse); -#ifdef HAVE_OPENSSL_NPN_NEGOTIATED +#ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB /* * An Enumerable of Strings. Each String represents a protocol to be * advertised as the list of supported protocols for Next Protocol @@ -2264,7 +2265,7 @@ Init_ossl_ssl(void) rb_define_method(cSSLSocket, "session=", ossl_ssl_set_session, 1); rb_define_method(cSSLSocket, "verify_result", ossl_ssl_get_verify_result, 0); rb_define_method(cSSLSocket, "client_ca", ossl_ssl_get_client_ca_list, 0); -# ifdef HAVE_OPENSSL_NPN_NEGOTIATED +# ifdef HAVE_SSL_CTX_SET_NEXT_PROTO_SELECT_CB rb_define_method(cSSLSocket, "npn_protocol", ossl_ssl_npn_protocol, 0); # endif #endif diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb index 7f180f0a43..aca09387ae 100644 --- a/test/openssl/test_ssl.rb +++ b/test/openssl/test_ssl.rb @@ -809,7 +809,9 @@ end } end -if OpenSSL::OPENSSL_VERSION_NUMBER > 0x10001000 +if OpenSSL::OPENSSL_VERSION_NUMBER > 0x10001000 && + OpenSSL::SSL::SSLContext.method_defined?(:npn_select_cb) + # NPN may be disabled by OpenSSL configure option def test_npn_protocol_selection_ary advertised = ["http/1.1", "spdy/2"] @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.2.5" #define RUBY_RELEASE_DATE "2016-03-30" -#define RUBY_PATCHLEVEL 286 +#define RUBY_PATCHLEVEL 287 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 3 |