diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-28 09:09:26 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-28 09:09:26 +0000 |
commit | 02afafb42ae4ae98140f2c79c67b948e1e6bc577 (patch) | |
tree | 293b883b6987a34a31e9f6d215b348c076c46ef9 | |
parent | 73cf9abd1c88eec81e86f697f29a6cbe58ad3d27 (diff) | |
download | ruby-02afafb42ae4ae98140f2c79c67b948e1e6bc577.tar.gz |
* ext/openssl/ossl_ssl.c (ossl_ssl_close): Fix sync_close to work
when SSL is not started.
This fix the fd leak by test_https_proxy_authentication in
test/net/http/test_https_proxy.rb.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46209 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ext/openssl/ossl_ssl.c | 24 | ||||
-rw-r--r-- | test/openssl/test_ssl.rb | 9 |
3 files changed, 30 insertions, 10 deletions
@@ -1,3 +1,10 @@ +Wed May 28 18:06:13 2014 Tanaka Akira <akr@fsij.org> + + * ext/openssl/ossl_ssl.c (ossl_ssl_close): Fix sync_close to work + when SSL is not started. + This fix the fd leak by test_https_proxy_authentication in + test/net/http/test_https_proxy.rb. + Wed May 28 10:29:28 2014 Eric Wong <e@80x24.org> * vm.c (rb_vm_living_threads_foreach): remove function diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index a95ab3d1d0..f314a7ac25 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -1566,18 +1566,22 @@ static VALUE ossl_ssl_close(VALUE self) { SSL *ssl; + VALUE io; - ossl_ssl_data_get_struct(self, ssl); + /* ossl_ssl_data_get_struct() is not usable here because it may return + * from this function; */ - if (ssl) { - VALUE io = ossl_ssl_get_io(self); - if (!RTEST(rb_funcall(io, rb_intern("closed?"), 0))) { - ossl_ssl_shutdown(ssl); - SSL_free(ssl); - DATA_PTR(self) = NULL; - if (RTEST(ossl_ssl_get_sync_close(self))) - rb_funcall(io, rb_intern("close"), 0); - } + Data_Get_Struct(self, SSL, ssl); + + io = ossl_ssl_get_io(self); + if (!RTEST(rb_funcall(io, rb_intern("closed?"), 0))) { + if (ssl) { + ossl_ssl_shutdown(ssl); + SSL_free(ssl); + } + DATA_PTR(self) = NULL; + if (RTEST(ossl_ssl_get_sync_close(self))) + rb_funcall(io, rb_intern("close"), 0); } return Qnil; diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb index 23dc572870..e99d3d9786 100644 --- a/test/openssl/test_ssl.rb +++ b/test/openssl/test_ssl.rb @@ -680,6 +680,15 @@ end } end + def test_sync_close_without_connect + Socket.open(:INET, :STREAM) {|s| + ssl = OpenSSL::SSL::SSLSocket.new(s) + ssl.sync_close = true + ssl.close + assert(s.closed?) + } + end + private def start_server_version(version, ctx_proc=nil, server_proc=nil, &blk) |