1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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/trunk@44184 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2013-12-13 16:11:12 +00:00
parent 42ae24a6e8
commit 4fd53e476e
5 changed files with 136 additions and 34 deletions

View file

@ -1,3 +1,13 @@
Sat Dec 14 01:05:46 2013 Tanaka Akira <akr@fsij.org>
* 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.
Sat Dec 14 00:34:31 2013 Naohisa Goto <ngotogenome@gmail.com>
* internal.h (ruby_sized_xrealloc2): fix typo introduced in r44117,

View file

@ -64,14 +64,19 @@ class Addrinfo
else
sock.connect(self)
end
rescue Exception
sock.close
raise
end
if block_given?
begin
yield sock
ensure
sock.close if !sock.closed?
end
else
sock
end
ensure
sock.close if !sock.closed? && (block_given? || $!)
end
end
private :connect_internal
@ -177,14 +182,19 @@ class Addrinfo
sock.ipv6only! if self.ipv6?
sock.setsockopt(:SOCKET, :REUSEADDR, 1)
sock.bind(self)
rescue Exception
sock.close
raise
end
if block_given?
begin
yield sock
ensure
sock.close if !sock.closed?
end
else
sock
end
ensure
sock.close if !sock.closed? && (block_given? || $!)
end
end
# creates a listening socket bound to self.
@ -195,14 +205,19 @@ class Addrinfo
sock.setsockopt(:SOCKET, :REUSEADDR, 1)
sock.bind(self)
sock.listen(backlog)
rescue Exception
sock.close
raise
end
if block_given?
begin
yield sock
ensure
sock.close if !sock.closed?
end
else
sock
end
ensure
sock.close if !sock.closed? && (block_given? || $!)
end
end
# iterates over the list of Addrinfo objects obtained by Addrinfo.getaddrinfo.
@ -348,8 +363,9 @@ class Socket < BasicSocket
# :stopdoc:
def self.ip_sockets_port0(ai_list, reuseaddr)
begin
sockets = []
begin
sockets.clear
port = nil
ai_list.each {|ai|
begin
@ -370,14 +386,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
@ -386,12 +401,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)
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
@ -435,9 +453,9 @@ class Socket < BasicSocket
if port == 0
sockets = tcp_server_sockets_port0(host)
else
begin
last_error = nil
sockets = []
begin
Addrinfo.foreach(host, port, nil, :STREAM, nil, Socket::AI_PASSIVE) {|ai|
begin
s = ai.listen
@ -450,8 +468,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?

View file

@ -574,14 +574,15 @@ class CGI
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:

View file

@ -328,8 +328,9 @@ module DRb
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

View file

@ -575,4 +575,75 @@ class TestSocket < Test::Unit::TestCase
assert_instance_of(Socket::Ifaddr, ifaddr)
}
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)