summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-04 19:58:16 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-04 19:58:16 +0000
commitbadfdcdc6ea4f1b2823c05c0901b836d6aa6b1c1 (patch)
treedbbf28ea34b15106054f9425f8627702c407ba12
parent7492bc1fe1f20ffde4fcd29b09846d77f5e83566 (diff)
downloadchromium_src-badfdcdc6ea4f1b2823c05c0901b836d6aa6b1c1.zip
chromium_src-badfdcdc6ea4f1b2823c05c0901b836d6aa6b1c1.tar.gz
chromium_src-badfdcdc6ea4f1b2823c05c0901b836d6aa6b1c1.tar.bz2
FTP: fix parsing of busybox-generated directory listings
The Bad test removed here was first introduced in https://codereview.chromium.org/3327025 . It turns out we just need to accept more time formats. BUG=312080 R=wtc@chromium.org Review URL: https://codereview.chromium.org/56663002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232770 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--net/data/ftp/dir-listing-ls-3213
-rw-r--r--net/data/ftp/dir-listing-ls-32.expected98
-rw-r--r--net/ftp/ftp_directory_listing_parser_ls_unittest.cc5
-rw-r--r--net/ftp/ftp_directory_listing_parser_unittest.cc1
-rw-r--r--net/ftp/ftp_util.cc38
5 files changed, 133 insertions, 22 deletions
diff --git a/net/data/ftp/dir-listing-ls-32 b/net/data/ftp/dir-listing-ls-32
new file mode 100644
index 0000000..aa21f24
--- /dev/null
+++ b/net/data/ftp/dir-listing-ls-32
@@ -0,0 +1,13 @@
+
+total 1
+drwxrwxr-x 1 500 244 660 Jan 1 00:0 bin
+drwxr-xr-x 1 0 0 0 Jan 1 00:0 dev
+drwxrwxr-x 1 500 244 272 Jan 1 00:0 etc
+drwxrwxr-x 1 500 244 16 Jan 1 00:0 mnt
+drwxrwxr-x 1 500 244 0 Jan 1 00:0 nfs
+dr-xr-xr-x 50 0 0 0 Jan 1 00:0 proc
+drwxrwxrwx 1 0 0 0 Jan 1 00:0 ram
+drwxrwxr-x 1 500 244 296 Jan 1 00:0 sbin
+lrwxrwxrwx 1 500 244 7 Jan 1 00:0 tmp -> ram/tmp
+drwxrwxr-x 1 500 244 16 Jan 1 00:0 usr
+lrwxrwxrwx 1 500 244 7 Jan 1 00:0 var -> ram/var
diff --git a/net/data/ftp/dir-listing-ls-32.expected b/net/data/ftp/dir-listing-ls-32.expected
new file mode 100644
index 0000000..ac54545
--- /dev/null
+++ b/net/data/ftp/dir-listing-ls-32.expected
@@ -0,0 +1,98 @@
+d
+bin
+-1
+1994
+1
+1
+0
+0
+
+d
+dev
+-1
+1994
+1
+1
+0
+0
+
+d
+etc
+-1
+1994
+1
+1
+0
+0
+
+d
+mnt
+-1
+1994
+1
+1
+0
+0
+
+d
+nfs
+-1
+1994
+1
+1
+0
+0
+
+d
+proc
+-1
+1994
+1
+1
+0
+0
+
+d
+ram
+-1
+1994
+1
+1
+0
+0
+
+d
+sbin
+-1
+1994
+1
+1
+0
+0
+
+l
+tmp
+-1
+1994
+1
+1
+0
+0
+
+d
+usr
+-1
+1994
+1
+1
+0
+0
+
+l
+var
+-1
+1994
+1
+1
+0
+0
diff --git a/net/ftp/ftp_directory_listing_parser_ls_unittest.cc b/net/ftp/ftp_directory_listing_parser_ls_unittest.cc
index a738944..313ef66 100644
--- a/net/ftp/ftp_directory_listing_parser_ls_unittest.cc
+++ b/net/ftp/ftp_directory_listing_parser_ls_unittest.cc
@@ -130,6 +130,10 @@ TEST_F(FtpDirectoryListingParserLsTest, Good) {
FtpDirectoryListingEntry::DIRECTORY, "swetzel", -1,
1994, 12, 22, 0, 0 },
+ { "drwxrwxr-x 1 500 244 660 Jan 1 00:0 bin",
+ FtpDirectoryListingEntry::DIRECTORY, "bin", -1,
+ 1994, 1, 1, 0, 0 },
+
// Garbage in date (but still parseable).
{ "lrw-rw-rw- 1 user group 542 "
"/t11/member/incomingFeb 8 2007 "
@@ -197,7 +201,6 @@ TEST_F(FtpDirectoryListingParserLsTest, Bad) {
"-rw-r--r-- ftp ftp 528 Foo 01 2007 README",
"-rw-r--r-- 1 ftp ftp",
"-rw-r--r-- 1 ftp ftp 528 Foo 01 2007 README",
- "drwxrwxrwx 1 owner group 1024 Sep 13 0:3 audio",
// Invalid month value (30).
"drwxrwxrwx 2 root root 4096 2012-30-07 00:31 notas_servico",
diff --git a/net/ftp/ftp_directory_listing_parser_unittest.cc b/net/ftp/ftp_directory_listing_parser_unittest.cc
index 73d19bc..f27007a 100644
--- a/net/ftp/ftp_directory_listing_parser_unittest.cc
+++ b/net/ftp/ftp_directory_listing_parser_unittest.cc
@@ -141,6 +141,7 @@ const char* kTestFiles[] = {
"dir-listing-ls-29",
"dir-listing-ls-30",
"dir-listing-ls-31",
+ "dir-listing-ls-32", // busybox
"dir-listing-netware-1",
"dir-listing-netware-2",
diff --git a/net/ftp/ftp_util.cc b/net/ftp/ftp_util.cc
index c5e18c8..472275a 100644
--- a/net/ftp/ftp_util.cc
+++ b/net/ftp/ftp_util.cc
@@ -245,29 +245,25 @@ bool FtpUtil::LsDateListingToTime(const base::string16& month,
return false;
if (!base::StringToInt(rest, &time_exploded.year)) {
- // Maybe it's time. Does it look like time (HH:MM)?
- if (rest.length() == 5 && rest[2] == ':') {
- if (!base::StringToInt(StringPiece16(rest.begin(), rest.begin() + 2),
- &time_exploded.hour)) {
- return false;
- }
+ // Maybe it's time. Does it look like time? Note that it can be any of
+ // "HH:MM", "H:MM", "HH:M" or maybe even "H:M".
+ if (rest.length() > 5)
+ return false;
- if (!base::StringToInt(StringPiece16(rest.begin() + 3, rest.begin() + 5),
- &time_exploded.minute)) {
- return false;
- }
- } else if (rest.length() == 4 && rest[1] == ':') {
- // Sometimes it's just H:MM.
- if (!base::StringToInt(StringPiece16(rest.begin(), rest.begin() + 1),
- &time_exploded.hour)) {
- return false;
- }
+ size_t colon_pos = rest.find(':');
+ if (colon_pos == string16::npos)
+ return false;
+ if (colon_pos > 2)
+ return false;
- if (!base::StringToInt(StringPiece16(rest.begin() + 2, rest.begin() + 4),
- &time_exploded.minute)) {
- return false;
- }
- } else {
+ if (!base::StringToInt(
+ StringPiece16(rest.begin(), rest.begin() + colon_pos),
+ &time_exploded.hour)) {
+ return false;
+ }
+ if (!base::StringToInt(
+ StringPiece16(rest.begin() + colon_pos + 1, rest.end()),
+ &time_exploded.minute)) {
return false;
}