[前][次][番号順一覧][スレッド一覧]

ruby-changes:14740

From: shugo <ko1@a...>
Date: Sat, 6 Feb 2010 23:06:31 +0900 (JST)
Subject: [ruby-changes:14740] Ruby:r26599 (trunk): * lib/net/imap.rb (receive_responses): does not hang when an unexpected BYE

shugo	2010-02-06 22:57:10 +0900 (Sat, 06 Feb 2010)

  New Revision: 26599

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26599

  Log:
    * lib/net/imap.rb (receive_responses): does not hang when an unexpected BYE
      response received.  fixed [ruby-core:27944].  Thanks, Bob Potter.

  Modified files:
    trunk/lib/net/imap.rb
    trunk/test/net/imap/test_imap.rb

Index: lib/net/imap.rb
===================================================================
--- lib/net/imap.rb	(revision 26598)
+++ lib/net/imap.rb	(revision 26599)
@@ -1017,7 +1017,8 @@
     end
 
     def receive_responses
-      while true
+      connection_closed = false
+      until connection_closed
         synchronize do
           @exception = nil
         end
@@ -1054,7 +1055,7 @@
               if resp.name == "BYE" && @logout_command_tag.nil?
                 @sock.close
                 @exception = ByeResponseError.new(resp)
-                break
+                connection_closed = true
               end
             when ContinuationRequest
               @continuation_request_arrival.signal
Index: test/net/imap/test_imap.rb
===================================================================
--- test/net/imap/test_imap.rb	(revision 26598)
+++ test/net/imap/test_imap.rb	(revision 26599)
@@ -279,6 +279,34 @@
     end
   end
 
+  def test_unexpected_bye
+    server = TCPServer.new(0)
+    port = server.addr[1]
+    Thread.start do
+      begin
+        sock = server.accept
+        begin
+          sock.print("* OK Gimap ready for requests from 75.101.246.151 33if2752585qyk.26\r\n")
+          sock.gets
+          sock.print("* BYE System Error 33if2752585qyk.26\r\n")
+        ensure
+          sock.close
+        end
+      rescue
+      end
+    end
+    begin
+      begin
+        imap = Net::IMAP.new("localhost", :port => port)
+        assert_raise(Net::IMAP::ByeResponseError) do
+          imap.login("user", "password")
+        end
+      end
+    ensure
+      server.close
+    end
+  end
+
   private
 
   def imaps_test

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]