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

ruby-changes:32311

From: nagachika <ko1@a...>
Date: Wed, 25 Dec 2013 00:38:14 +0900 (JST)
Subject: [ruby-changes:32311] nagachika:r44390 (ruby_2_0_0): merge revision(s) 44184: [Backport #9247]

nagachika	2013-12-25 00:37:51 +0900 (Wed, 25 Dec 2013)

  New Revision: 44390

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

  Log:
    merge revision(s) 44184: [Backport #9247]
    
    * ext/socket/lib/socket.rb: Don't test $! in "ensure" clause because
      it may be set before the body.
      Reported by ko1 and mrkn.  [ruby-core:59088] [Bug #9247]
    
    * lib/cgi/core.rb: Ditto.
    
    * lib/drb/ssl.rb: Ditto.

  Modified directories:
    branches/ruby_2_0_0/
  Modified files:
    branches/ruby_2_0_0/ChangeLog
    branches/ruby_2_0_0/ext/socket/lib/socket.rb
    branches/ruby_2_0_0/lib/cgi/core.rb
    branches/ruby_2_0_0/lib/drb/ssl.rb
    branches/ruby_2_0_0/test/socket/test_socket.rb
    branches/ruby_2_0_0/version.h
Index: ruby_2_0_0/ChangeLog
===================================================================
--- ruby_2_0_0/ChangeLog	(revision 44389)
+++ ruby_2_0_0/ChangeLog	(revision 44390)
@@ -1,3 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ChangeLog#L1
+Wed Dec 25 00:18:19 2013  Tanaka Akira  <akr@f...>
+
+	* ext/socket/lib/socket.rb: Don't test $! in "ensure" clause because
+	  it may be set before the body.
+	  Reported by ko1 and mrkn.  [ruby-core:59088] [Bug #9247]
+
+	* lib/cgi/core.rb: Ditto.
+
+	* lib/drb/ssl.rb: Ditto.
+
 Tue Dec 24 00:18:14 2013  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/mkmf.rb (configuration): strip destdir part from prefix to get
Index: ruby_2_0_0/lib/cgi/core.rb
===================================================================
--- ruby_2_0_0/lib/cgi/core.rb	(revision 44389)
+++ ruby_2_0_0/lib/cgi/core.rb	(revision 44390)
@@ -574,14 +574,15 @@ class CGI https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/lib/cgi/core.rb#L574
       raise EOFError, "bad boundary end of body part" unless boundary_end =~ /--/
       params.default = []
       params
-    ensure
-      if $! && tempfiles
+    rescue Exception
+      if tempfiles
         tempfiles.each {|t|
           if t.path
             t.unlink
           end
         }
       end
+      raise
     end # read_multipart
     private :read_multipart
     def create_body(is_large)  #:nodoc:
Index: ruby_2_0_0/lib/drb/ssl.rb
===================================================================
--- ruby_2_0_0/lib/drb/ssl.rb	(revision 44389)
+++ ruby_2_0_0/lib/drb/ssl.rb	(revision 44390)
@@ -328,8 +328,9 @@ module DRb https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/lib/drb/ssl.rb#L328
       end
       begin
 	ssl = @config.accept(soc)
-      ensure
-        soc.close if $!
+      rescue Exception
+        soc.close
+        raise
       end
       self.class.new(uri, ssl, @config, true)
       rescue OpenSSL::SSL::SSLError
Index: ruby_2_0_0/ext/socket/lib/socket.rb
===================================================================
--- ruby_2_0_0/ext/socket/lib/socket.rb	(revision 44389)
+++ ruby_2_0_0/ext/socket/lib/socket.rb	(revision 44390)
@@ -64,13 +64,18 @@ class Addrinfo https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L64
       else
         sock.connect(self)
       end
-      if block_given?
+    rescue Exception
+      sock.close
+      raise
+    end
+    if block_given?
+      begin
         yield sock
-      else
-        sock
+      ensure
+        sock.close if !sock.closed?
       end
-    ensure
-      sock.close if !sock.closed? && (block_given? || $!)
+    else
+      sock
     end
   end
   private :connect_internal
@@ -177,13 +182,18 @@ class Addrinfo https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L182
       sock.ipv6only! if self.ipv6?
       sock.setsockopt(:SOCKET, :REUSEADDR, 1)
       sock.bind(self)
-      if block_given?
+    rescue Exception
+      sock.close
+      raise
+    end
+    if block_given?
+      begin
         yield sock
-      else
-        sock
+      ensure
+        sock.close if !sock.closed?
       end
-    ensure
-      sock.close if !sock.closed? && (block_given? || $!)
+    else
+      sock
     end
   end
 
@@ -195,13 +205,18 @@ class Addrinfo https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L205
       sock.setsockopt(:SOCKET, :REUSEADDR, 1)
       sock.bind(self)
       sock.listen(backlog)
-      if block_given?
+    rescue Exception
+      sock.close
+      raise
+    end
+    if block_given?
+      begin
         yield sock
-      else
-        sock
+      ensure
+        sock.close if !sock.closed?
       end
-    ensure
-      sock.close if !sock.closed? && (block_given? || $!)
+    else
+      sock
     end
   end
 
@@ -353,8 +368,9 @@ class Socket < BasicSocket https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L368
 
   # :stopdoc:
   def self.ip_sockets_port0(ai_list, reuseaddr)
+    sockets = []
     begin
-      sockets = []
+      sockets.clear
       port = nil
       ai_list.each {|ai|
         begin
@@ -375,14 +391,13 @@ class Socket < BasicSocket https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L391
         end
       }
     rescue Errno::EADDRINUSE
-      sockets.each {|s|
-        s.close
-      }
+      sockets.each {|s| s.close }
       retry
+    rescue Exception
+      sockets.each {|s| s.close }
+      raise
     end
     sockets
-  ensure
-    sockets.each {|s| s.close if !s.closed? } if $!
   end
   class << self
     private :ip_sockets_port0
@@ -391,12 +406,15 @@ class Socket < BasicSocket https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L406
   def self.tcp_server_sockets_port0(host)
     ai_list = Addrinfo.getaddrinfo(host, 0, nil, :STREAM, nil, Socket::AI_PASSIVE)
     sockets = ip_sockets_port0(ai_list, true)
-    sockets.each {|s|
-      s.listen(Socket::SOMAXCONN)
-    }
+    begin
+      sockets.each {|s|
+        s.listen(Socket::SOMAXCONN)
+      }
+    rescue Exception
+      sockets.each {|s| s.close }
+      raise
+    end
     sockets
-  ensure
-    sockets.each {|s| s.close if !s.closed? } if $! && sockets
   end
   class << self
     private :tcp_server_sockets_port0
@@ -440,9 +458,9 @@ class Socket < BasicSocket https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L458
     if port == 0
       sockets = tcp_server_sockets_port0(host)
     else
+      last_error = nil
+      sockets = []
       begin
-        last_error = nil
-        sockets = []
         Addrinfo.foreach(host, port, nil, :STREAM, nil, Socket::AI_PASSIVE) {|ai|
           begin
             s = ai.listen
@@ -455,8 +473,9 @@ class Socket < BasicSocket https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ext/socket/lib/socket.rb#L473
         if sockets.empty?
           raise last_error
         end
-      ensure
-        sockets.each {|s| s.close if !s.closed? } if $!
+      rescue Exception
+        sockets.each {|s| s.close }
+        raise
       end
     end
     if block_given?
Index: ruby_2_0_0/version.h
===================================================================
--- ruby_2_0_0/version.h	(revision 44389)
+++ ruby_2_0_0/version.h	(revision 44390)
@@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/version.h#L1
 #define RUBY_VERSION "2.0.0"
-#define RUBY_RELEASE_DATE "2013-12-24"
-#define RUBY_PATCHLEVEL 373
+#define RUBY_RELEASE_DATE "2013-12-25"
+#define RUBY_PATCHLEVEL 374
 
 #define RUBY_RELEASE_YEAR 2013
 #define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 24
+#define RUBY_RELEASE_DAY 25
 
 #include "ruby/version.h"
 
Index: ruby_2_0_0/test/socket/test_socket.rb
===================================================================
--- ruby_2_0_0/test/socket/test_socket.rb	(revision 44389)
+++ ruby_2_0_0/test/socket/test_socket.rb	(revision 44390)
@@ -548,4 +548,75 @@ class TestSocket < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/socket/test_socket.rb#L548
     accepted.close if accepted
     sock.close if sock && ! sock.closed?
   end
+
+  def test_connect_in_rescue
+    serv = Addrinfo.tcp(nil, 0).listen
+    addr = serv.connect_address
+    begin
+      raise "dummy error"
+    rescue
+      s = addr.connect
+      assert(!s.closed?)
+    end
+  ensure
+    serv.close if serv && !serv.closed?
+    s.close if s && !s.closed?
+  end
+
+  def test_bind_in_rescue
+    begin
+      raise "dummy error"
+    rescue
+      s = Addrinfo.tcp(nil, 0).bind
+      assert(!s.closed?)
+    end
+  ensure
+    s.close if s && !s.closed?
+  end
+
+  def test_listen_in_rescue
+    begin
+      raise "dummy error"
+    rescue
+      s = Addrinfo.tcp(nil, 0).listen
+      assert(!s.closed?)
+    end
+  ensure
+    s.close if s && !s.closed?
+  end
+
+  def test_udp_server_sockets_in_rescue
+    begin
+      raise "dummy error"
+    rescue
+      ss = Socket.udp_server_sockets(0)
+      ss.each {|s|
+        assert(!s.closed?)
+      }
+    end
+  ensure
+    if ss
+      ss.each {|s|
+        s.close if !s.closed?
+      }
+    end
+  end
+
+  def test_tcp_server_sockets_in_rescue
+    begin
+      raise "dummy error"
+    rescue
+      ss = Socket.tcp_server_sockets(0)
+      ss.each {|s|
+        assert(!s.closed?)
+      }
+    end
+  ensure
+    if ss
+      ss.each {|s|
+        s.close if !s.closed?
+      }
+    end
+  end
+
 end if defined?(Socket)

Property changes on: ruby_2_0_0
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r44184


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

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