Bug #11260 ยป 0001-lib-net-ftp.rb-makeport-close-the-TCPServer.patch
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
|