summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/net/ftp.rb9
-rw-r--r--test/net/ftp/test_ftp.rb25
3 files changed, 38 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index caea02936e..8b2fdfbacc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Sep 12 18:14:11 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (parse_mlsx_entry, mlst) raise an FTPProtoError
+ when parsing failed.
+
Sat Sep 12 18:00:35 2015 Shugo Maeda <shugo@ruby-lang.org>
* lib/net/ftp.rb (TIME_PARSER): use "Z" instead of "+00:00" to
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 8bd309b21a..f4f7494a04 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -795,6 +795,9 @@ module Net
def parse_mlsx_entry(entry)
facts, pathname = entry.split(" ")
+ unless pathname
+ raise FTPProtoError, entry
+ end
return MLSxEntry.new(
facts.scan(/(.*?)=(.*?);/).each_with_object({}) {
|(factname, value), h|
@@ -816,7 +819,11 @@ module Net
if !resp.start_with?("250")
raise FTPReplyError, resp
end
- entry = resp.lines[1].sub(/\A(250-| *)/, "")
+ line = resp.lines[1]
+ unless line
+ raise FTPProtoError, resp
+ end
+ entry = line.sub(/\A(250-| *)/, "")
return parse_mlsx_entry(entry)
end
diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb
index 9fb2c1a03b..d347a30a1e 100644
--- a/test/net/ftp/test_ftp.rb
+++ b/test/net/ftp/test_ftp.rb
@@ -1127,12 +1127,23 @@ EOF
sock.print("250- Listing foo\r\n")
sock.print(" Type=file;Unique=FC00U1E554A;Size=1234567;Modify=20131220035929;Perm=r; /foo\r\n")
sock.print("250 End\r\n")
+ commands.push(sock.gets)
+ sock.print("250 Malformed response\r\n")
+ commands.push(sock.gets)
+ sock.print("250- Listing foo\r\n")
+ sock.print("\r\n")
+ sock.print("250 End\r\n")
+ commands.push(sock.gets)
+ sock.print("250- Listing foo\r\n")
+ sock.print(" abc /foo\r\n")
+ sock.print("250 End\r\n")
}
begin
begin
ftp = Net::FTP.new
ftp.connect(SERVER_ADDR, server.port)
entry = ftp.mlst("foo")
+ assert_equal("/foo", entry.pathname)
assert_equal("file", entry.facts["type"])
assert_equal("FC00U1E554A", entry.facts["unique"])
assert_equal(1234567, entry.facts["size"])
@@ -1146,6 +1157,17 @@ EOF
assert_equal(29, modify.sec)
assert_equal(true, modify.utc?)
assert_match("MLST foo\r\n", commands.shift)
+ assert_raise(Net::FTPProtoError) do
+ ftp.mlst("foo")
+ end
+ assert_match("MLST foo\r\n", commands.shift)
+ assert_raise(Net::FTPProtoError) do
+ ftp.mlst("foo")
+ end
+ assert_match("MLST foo\r\n", commands.shift)
+ entry = ftp.mlst("foo")
+ assert_equal("/foo", entry.pathname)
+ assert_match("MLST foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
ftp.close if ftp
@@ -1204,6 +1226,9 @@ EOF
assert_equal("TYPE I\r\n", commands.shift)
entries = ftp.mlsd("/")
assert_equal(3, entries.size)
+ assert_equal("foo", entries[0].pathname)
+ assert_equal(".", entries[1].pathname)
+ assert_equal("..", entries[2].pathname)
assert_equal("file", entries[0].facts["type"])
assert_equal("cdir", entries[1].facts["type"])
assert_equal("pdir", entries[2].facts["type"])