summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorcevans@chromium.org <cevans@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-15 21:44:31 +0000
committercevans@chromium.org <cevans@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-15 21:44:31 +0000
commit067086103743fa898f4dedae1c7c07a9688c27be (patch)
treed820f706c644698ed3fbe17d3e849dda6a158b0c /base
parent449f269f07a53ee461aa11e19533fb4c8a32d889 (diff)
downloadchromium_src-067086103743fa898f4dedae1c7c07a9688c27be.zip
chromium_src-067086103743fa898f4dedae1c7c07a9688c27be.tar.gz
chromium_src-067086103743fa898f4dedae1c7c07a9688c27be.tar.bz2
Add "bool FilePath::ReferencesParent()" which adds a clean & simple way for
checking for ".." in a FilePath. Needed to make an upcoming security fix clean. BUG=NONE TEST=FilePathTest.ReferencesParent Review URL: http://codereview.chromium.org/172012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23528 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r--base/file_path.cc14
-rw-r--r--base/file_path.h4
-rw-r--r--base/file_path_unittest.cc33
3 files changed, 50 insertions, 1 deletions
diff --git a/base/file_path.cc b/base/file_path.cc
index 6134f2b..222b225 100644
--- a/base/file_path.cc
+++ b/base/file_path.cc
@@ -461,3 +461,17 @@ void FilePath::StripTrailingSeparatorsInternal() {
}
}
}
+
+bool FilePath::ReferencesParent() const {
+ std::vector<FilePath::StringType> components;
+ GetComponents(&components);
+
+ std::vector<FilePath::StringType>::const_iterator it = components.begin();
+ for (; it != components.end(); ++it) {
+ const FilePath::StringType& component = *it;
+ if (component == kParentDirectory)
+ return true;
+ }
+ return false;
+}
+
diff --git a/base/file_path.h b/base/file_path.h
index 6bd2216..0b2ba5c 100644
--- a/base/file_path.h
+++ b/base/file_path.h
@@ -226,6 +226,10 @@ class FilePath {
// separator.
FilePath StripTrailingSeparators() const;
+ // Returns true if this FilePath contains any attempt to reference a parent
+ // directory (i.e. has a path component that is ".."
+ bool ReferencesParent() const;
+
// Older Chromium code assumes that paths are always wstrings.
// This function converts a wstring to a FilePath, and is useful to smooth
// porting that old code to the FilePath API.
diff --git a/base/file_path_unittest.cc b/base/file_path_unittest.cc
index ca30baa..e14bbca 100644
--- a/base/file_path_unittest.cc
+++ b/base/file_path_unittest.cc
@@ -535,7 +535,6 @@ TEST_F(FilePathTest, EqualityTest) {
b.value();
}
-
for (size_t i = 0; i < arraysize(cases); ++i) {
FilePath a(cases[i].inputs[0]);
FilePath b(cases[i].inputs[1]);
@@ -734,3 +733,35 @@ TEST_F(FilePathTest, MatchesExtension) {
"i: " << i << ", path: " << path.value() << ", ext: " << ext;
}
}
+
+TEST_F(FilePathTest, ReferencesParent) {
+ const struct UnaryBooleanTestData cases[] = {
+ { FPL("."), false },
+ { FPL(".."), true },
+ { FPL("a.."), false },
+ { FPL("..a"), false },
+ { FPL("../"), true },
+ { FPL("/.."), true },
+ { FPL("/../"), true },
+ { FPL("/a../"), false },
+ { FPL("/..a/"), false },
+ { FPL("//.."), true },
+ { FPL("..//"), true },
+ { FPL("//..//"), true },
+ { FPL("a//..//c"), true },
+ { FPL("../b/c"), true },
+ { FPL("/../b/c"), true },
+ { FPL("a/b/.."), true },
+ { FPL("a/b/../"), true },
+ { FPL("a/../c"), true },
+ { FPL("a/b/c"), false },
+ };
+
+ for (size_t i = 0; i < arraysize(cases); ++i) {
+ FilePath input(cases[i].input);
+ bool observed = input.ReferencesParent();
+ EXPECT_EQ(cases[i].expected, observed) <<
+ "i: " << i << ", input: " << input.value();
+ }
+}
+