8000 merge revision(s) 51046: [Backport #11260] · github/ruby@190241f · GitHub
[go: up one dir, main page]

Skip to content

Commit 190241f

Browse files
committed
merge revision(s) 51046: [Backport ruby#11260]
* lib/net/ftp.rb (makeport): close the TCPServer when sending the port fails. * test/net/ftp/test_ftp.rb: test for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@51610 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent a5ffcda commit 190241f

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Mon Aug 17 17:42:18 2015 Benoit Daloze <eregontp@gmail.com>
2+
3+
* lib/net/ftp.rb (makeport): close the TCPServer
4+
when sending the port fails.
5+
6+
* test/net/ftp/test_ftp.rb: test for above.
7+
18
Mon Aug 17 17:38:15 2015 Kazuki Tsujimoto <kazuki@callcc.net>
29

310
* lib/net/http/response.rb (Net::HTTPResponse::Inflater#finish):

lib/net/ftp.rb

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -377,15 +377,9 @@ def sendport(host, port) # :nodoc:
377377
end
378378
private :sendport
379379

380-
# Constructs a TCPServer socket, and sends it the PORT command
381-
#
382-
# Returns the constructed TCPServer socket
380+
# Constructs a TCPServer socket
383381
def makeport # :nodoc:
384-
sock = TCPServer.open(@sock.addr[3], 0)
385-
port = sock.addr[1]
386-
host = sock.addr[3]
387-
sendport(host, port)
388-
return sock
382+
TCPServer.open(@sock.addr[3], 0)
389383
end
390384
private :makeport
391385

@@ -421,6 +415,7 @@ def transfercmd(cmd, rest_offset = nil) # :nodoc:
421415
else
422416
sock = makeport
423417
begin
418+
sendport(sock.addr[3], sock.addr[1])
424419
if @resume and rest_offset
425420
resp = sendcmd("REST " + rest_offset.to_s)
426421
if resp[0] != ?3

test/net/ftp/test_ftp.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,46 @@ def test_list_fail
477477
end
478478
end
479479

480+
def test_open_data_port_fail_no_leak
481+
commands = []
482+
server = create_ftp_server { |sock|
483+
sock.print("220 (test_ftp).\r\n")
484+
commands.push(sock.gets)
485+
sock.print("331 Please specify the password.\r\n")
486+
commands.push(sock.gets)
487+
sock.print("230 Login successful.\r\n")
488+
commands.push(sock.gets)
489+
sock.print("200 Switching to Binary mode.\r\n")
490+
commands.push(sock.gets)
491+
sock.print("200 Switching to ASCII mode.\r\n")
492+
line = sock.gets
493+
commands.push(line)
494+
sock.print("421 Service not available, closing control connection.\r\n")
495+
commands.push(sock.gets)
496+
sock.print("200 Switching to Binary mode.\r\n")
497+
}
498+
begin
499+
begin
500+
ftp = Net::FTP.new
501+
ftp.read_timeout = 0.2
502+
ftp.connect(SERVER_ADDR, server.port)
503+
ftp.login
504+
assert_match(/\AUSER /, commands.shift)
505+
assert_match(/\APASS /, commands.shift)
506+
assert_equal("TYPE I\r\n", commands.shift)
507+
assert_raise(Net::FTPTempError){ ftp.list }
508+
assert_equal("TYPE A\r\n", commands.shift)
509+
assert_match(/\APORT /, commands.shift)
510+
assert_equal("TYPE I\r\n", commands.shift)
511+
assert_equal(nil, commands.shift)
512+
ensure
513+
ftp.close if ftp
514+
end
515+
ensure
516+
server.close
517+
end
518+
end
519+
480520
def test_retrbinary_read_timeout_exceeded
481521
commands = []
482522
binary_data = (0..0xff).map {|i| i.chr}.join * 4 * 3

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define RUBY_VERSION "2.1.7"
22
#define RUBY_RELEASE_DATE "2015-08-17"
3-
#define RUBY_PATCHLEVEL 392
3+
#define RUBY_PATCHLEVEL 393
44

55
#define RUBY_RELEASE_YEAR 2015
66
#define RUBY_RELEASE_MONTH 8

0 commit comments

Comments
 (0)
0