From cbd370f669e74ca3e1953da94d4e780b7ddea391 Mon Sep 17 00:00:00 2001 From: akr Date: Wed, 28 May 2014 10:02:54 +0000 Subject: * lib/net/imap.rb (Net::IMAP#initialize): Close the opened socket when any exception occur. This fixes a fd leak by IMAPTest#test_imaps_post_connection_check which start_tls_session() raises an exception. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46210 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++ lib/net/imap.rb | 67 ++++++++++++++++++++++++---------------------- test/net/imap/test_imap.rb | 25 ++++++++--------- 3 files changed, 55 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index 48dc05d311..175b315f23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed May 28 19:00:31 2014 Tanaka Akira + + * lib/net/imap.rb (Net::IMAP#initialize): Close the opened socket when + any exception occur. + This fixes a fd leak by IMAPTest#test_imaps_post_connection_check + which start_tls_session() raises an exception. + Wed May 28 18:06:13 2014 Tanaka Akira * ext/openssl/ossl_ssl.c (ossl_ssl_close): Fix sync_close to work diff --git a/lib/net/imap.rb b/lib/net/imap.rb index 6b5ff3ee71..2e0f558054 100644 --- a/lib/net/imap.rb +++ b/lib/net/imap.rb @@ -1043,40 +1043,43 @@ module Net @tagno = 0 @parser = ResponseParser.new @sock = TCPSocket.open(@host, @port) - if options[:ssl] - start_tls_session(options[:ssl]) - @usessl = true - else - @usessl = false - end - @responses = Hash.new([].freeze) - @tagged_responses = {} - @response_handlers = [] - @tagged_response_arrival = new_cond - @continuation_request_arrival = new_cond - @idle_done_cond = nil - @logout_command_tag = nil - @debug_output_bol = true - @exception = nil - - @greeting = get_response - if @greeting.nil? - @sock.close - raise Error, "connection closed" - end - if @greeting.name == "BYE" - @sock.close - raise ByeResponseError, @greeting - end + begin + if options[:ssl] + start_tls_session(options[:ssl]) + @usessl = true + else + @usessl = false + end + @responses = Hash.new([].freeze) + @tagged_responses = {} + @response_handlers = [] + @tagged_response_arrival = new_cond + @continuation_request_arrival = new_cond + @idle_done_cond = nil + @logout_command_tag = nil + @debug_output_bol = true + @exception = nil - @client_thread = Thread.current - @receiver_thread = Thread.start { - begin - receive_responses - rescue Exception + @greeting = get_response + if @greeting.nil? + raise Error, "connection closed" end - } - @receiver_thread_terminating = false + if @greeting.name == "BYE" + raise ByeResponseError, @greeting + end + + @client_thread = Thread.current + @receiver_thread = Thread.start { + begin + receive_responses + rescue Exception + end + } + @receiver_thread_terminating = false + rescue Exception + @sock.close + raise + end end def receive_responses diff --git a/test/net/imap/test_imap.rb b/test/net/imap/test_imap.rb index 4abb7b48f3..ecec2a5d5e 100644 --- a/test/net/imap/test_imap.rb +++ b/test/net/imap/test_imap.rb @@ -505,19 +505,20 @@ class IMAPTest < Test::Unit::TestCase ths = Thread.start do begin sock = server.accept - sock.print("* OK test server\r\n") - sock.gets - sock.print("RUBY0001 OK completed\r\n") - ctx = OpenSSL::SSL::SSLContext.new - ctx.ca_file = CA_FILE - ctx.key = File.open(SERVER_KEY) { |f| - OpenSSL::PKey::RSA.new(f) - } - ctx.cert = File.open(SERVER_CERT) { |f| - OpenSSL::X509::Certificate.new(f) - } - sock = OpenSSL::SSL::SSLSocket.new(sock, ctx) begin + sock.print("* OK test server\r\n") + sock.gets + sock.print("RUBY0001 OK completed\r\n") + ctx = OpenSSL::SSL::SSLContext.new + ctx.ca_file = CA_FILE + ctx.key = File.open(SERVER_KEY) { |f| + OpenSSL::PKey::RSA.new(f) + } + ctx.cert = File.open(SERVER_CERT) { |f| + OpenSSL::X509::Certificate.new(f) + } + sock = OpenSSL::SSL::SSLSocket.new(sock, ctx) + sock.sync_close = true sock.accept sock.gets sock.print("* BYE terminating connection\r\n") -- cgit v1.2.3