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
|
||