summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/util.cc6
-rw-r--r--src/util_test.cc5
2 files changed, 9 insertions, 2 deletions
diff --git a/src/util.cc b/src/util.cc
index b68227b..e8fcc64 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -42,7 +42,8 @@ void Error(const char* msg, ...) {
bool CanonicalizePath(std::string* path, std::string* err) {
// Try to fast-path out the common case.
if (path->find("/.") == std::string::npos &&
- path->find("./") == std::string::npos) {
+ path->find("./") == std::string::npos &&
+ path->find("//") == std::string::npos) {
return true;
}
@@ -54,7 +55,8 @@ bool CanonicalizePath(std::string* path, std::string* err) {
end = inpath.size();
else
inpath[end] = 0;
- parts.push_back(inpath.data() + start);
+ if (end > start)
+ parts.push_back(inpath.data() + start);
start = end;
}
diff --git a/src/util_test.cc b/src/util_test.cc
index 145c80e..4b4c760 100644
--- a/src/util_test.cc
+++ b/src/util_test.cc
@@ -43,6 +43,11 @@ TEST(CanonicalizePath, PathSamples) {
EXPECT_EQ("", err);
EXPECT_EQ("bar.h", path);
+ path = "foo//bar"; err = "";
+ EXPECT_TRUE(CanonicalizePath(&path, &err));
+ EXPECT_EQ("", err);
+ EXPECT_EQ("foo/bar", path);
+
path = "./x/../foo/../../bar.h"; err = "";
EXPECT_FALSE(CanonicalizePath(&path, &err));
EXPECT_EQ("can't canonicalize path './x/../foo/../../bar.h' that reaches "