summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/openssl/ossl_ssl.c24
-rw-r--r--test/openssl/test_ssl.rb9
3 files changed, 30 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 21eab9aca2..48dc05d311 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)