summaryrefslogtreecommitdiffstats
path: root/net/ftp
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-06 09:20:48 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-06 09:20:48 +0000
commitf5aba662bd2a0a85f1071d621f9dfa88485872b2 (patch)
tree73fa0c12b307b49e02597eae3a133392bcfe325e /net/ftp
parent543b18afcaa226282e0c67ad3fdf60f8f1933704 (diff)
downloadchromium_src-f5aba662bd2a0a85f1071d621f9dfa88485872b2.zip
chromium_src-f5aba662bd2a0a85f1071d621f9dfa88485872b2.tar.gz
chromium_src-f5aba662bd2a0a85f1071d621f9dfa88485872b2.tar.bz2
Fix the "ls -l" FTP LIST format parser to understand correctly
listings sent by VMS MultiNet servers emulating Unix. TEST=Covered by net_unittests. BUG=22193, 25520 Review URL: http://codereview.chromium.org/368006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31217 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/ftp')
-rw-r--r--net/ftp/ftp_directory_listing_buffer_unittest.cc2
-rw-r--r--net/ftp/ftp_directory_listing_parsers.cc10
-rw-r--r--net/ftp/ftp_directory_listing_parsers.h2
-rw-r--r--net/ftp/ftp_directory_listing_parsers_unittest.cc1
4 files changed, 13 insertions, 2 deletions
diff --git a/net/ftp/ftp_directory_listing_buffer_unittest.cc b/net/ftp/ftp_directory_listing_buffer_unittest.cc
index ae448fb..00c37963 100644
--- a/net/ftp/ftp_directory_listing_buffer_unittest.cc
+++ b/net/ftp/ftp_directory_listing_buffer_unittest.cc
@@ -19,6 +19,8 @@ TEST(FtpDirectoryListingBufferTest, Parse) {
"dir-listing-ls-1",
"dir-listing-ls-1-utf8",
"dir-listing-ls-2",
+ "dir-listing-ls-3",
+ "dir-listing-ls-4",
"dir-listing-vms-1",
"dir-listing-vms-2",
"dir-listing-vms-3",
diff --git a/net/ftp/ftp_directory_listing_parsers.cc b/net/ftp/ftp_directory_listing_parsers.cc
index 5f160e3..4149390 100644
--- a/net/ftp/ftp_directory_listing_parsers.cc
+++ b/net/ftp/ftp_directory_listing_parsers.cc
@@ -236,10 +236,18 @@ namespace net {
FtpDirectoryListingParser::~FtpDirectoryListingParser() {
}
-FtpLsDirectoryListingParser::FtpLsDirectoryListingParser() {
+FtpLsDirectoryListingParser::FtpLsDirectoryListingParser()
+ : received_nonempty_line_(false) {
}
bool FtpLsDirectoryListingParser::ConsumeLine(const string16& line) {
+ // Allow empty lines only at the beginning of the listing. For example VMS
+ // systems in Unix emulation mode add an empty line before the first listing
+ // entry.
+ if (line.empty() && !received_nonempty_line_)
+ return true;
+ received_nonempty_line_ = true;
+
std::vector<string16> columns;
SplitString(CollapseWhitespace(line, false), ' ', &columns);
if (columns.size() == 11) {
diff --git a/net/ftp/ftp_directory_listing_parsers.h b/net/ftp/ftp_directory_listing_parsers.h
index 230c641..2cf0c4f 100644
--- a/net/ftp/ftp_directory_listing_parsers.h
+++ b/net/ftp/ftp_directory_listing_parsers.h
@@ -55,6 +55,8 @@ class FtpLsDirectoryListingParser : public FtpDirectoryListingParser {
virtual FtpDirectoryListingEntry PopEntry();
private:
+ bool received_nonempty_line_;
+
std::queue<FtpDirectoryListingEntry> entries_;
DISALLOW_COPY_AND_ASSIGN(FtpLsDirectoryListingParser);
diff --git a/net/ftp/ftp_directory_listing_parsers_unittest.cc b/net/ftp/ftp_directory_listing_parsers_unittest.cc
index cc05f36..0d0c1f5 100644
--- a/net/ftp/ftp_directory_listing_parsers_unittest.cc
+++ b/net/ftp/ftp_directory_listing_parsers_unittest.cc
@@ -76,7 +76,6 @@ TEST_F(FtpDirectoryListingParsersTest, Ls) {
}
const char* bad_cases[] = {
- "",
"garbage",
"-rw-r--r-- 1 ftp ftp",
"-rw-r--rgb 1 ftp ftp 528 Nov 01 2007 README",