mirror of
https://github.com/ruby/ruby.git
synced 2025-09-17 17:43:59 +02:00
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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@44390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b9bfc5b8aa
commit
ad5757276d
6 changed files with 139 additions and 37 deletions
|
@ -64,13 +64,18 @@ class Addrinfo
|
|||
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
|
|||
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
|
|||
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
|
|||
|
||||
# :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
|
|||
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
|
|||
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
|
|||
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
|
|||
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?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue