Project

General

Profile

Bug #11260 ยป 0001-lib-net-ftp.rb-makeport-close-the-TCPServer.patch

Eregon (Benoit Daloze), 06/14/2015 10:06 AM

View differences:

ChangeLog
Sun Jun 14 19:02:03 2015 Benoit Daloze <eregontp@gmail.com>
* lib/net/ftp.rb (makeport): close the TCPServer
when sending the port fails.
* test/net/ftp/test_ftp.rb: test for above.
Sun Jun 14 06:24:57 2015 Benoit Daloze <eregontp@gmail.com>
* test/ruby/test_io.rb: add test for IO.binread fd leak.
lib/net/ftp.rb
end
private :sendport
# Constructs a TCPServer socket, and sends it the PORT command
#
# Returns the constructed TCPServer socket
# Constructs a TCPServer socket
def makeport # :nodoc:
sock = TCPServer.open(@sock.addr[3], 0)
port = sock.addr[1]
host = sock.addr[3]
sendport(host, port)
return sock
TCPServer.open(@sock.addr[3], 0)
end
private :makeport
......
else
sock = makeport
begin
sendport(sock.addr[3], sock.addr[1])
if @resume and rest_offset
resp = sendcmd("REST " + rest_offset.to_s)
if resp[0] != ?3
test/net/ftp/test_ftp.rb
end
end
def test_open_data_port_fail_no_leak
commands = []
server = create_ftp_server { |sock|
sock.print("220 (test_ftp).\r\n")
commands.push(sock.gets)
sock.print("331 Please specify the password.\r\n")
commands.push(sock.gets)
sock.print("230 Login successful.\r\n")
commands.push(sock.gets)
sock.print("200 Switching to Binary mode.\r\n")
commands.push(sock.gets)
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
sock.print("421 Service not available, closing control connection.\r\n")
commands.push(sock.gets)
sock.print("200 Switching to Binary mode.\r\n")
}
begin
begin
ftp = Net::FTP.new
ftp.read_timeout = 0.2
ftp.connect(SERVER_ADDR, server.port)
ftp.login
assert_match(/\AUSER /, commands.shift)
assert_match(/\APASS /, commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_raise(Net::FTPTempError){ ftp.list }
assert_equal("TYPE A\r\n", commands.shift)
assert_match(/\APORT /, commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
ftp.close if ftp
end
ensure
server.close
end
end
def test_retrbinary_read_timeout_exceeded
commands = []
binary_data = (0..0xff).map {|i| i.chr}.join * 4 * 3
    (1-1/1)