diff options
-rw-r--r-- | src/util.cc | 6 | ||||
-rw-r--r-- | src/util_test.cc | 5 |
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 " |