summaryrefslogtreecommitdiffstats
path: root/src/util_test.cc
diff options
context:
space:
mode:
authorScott Graham <scottmg@chromium.org>2014-11-12 17:16:25 (GMT)
committerScott Graham <scottmg@chromium.org>2014-11-12 17:16:25 (GMT)
commitcc8b72a87d72a030dc5b2bb212958c0e46213a6b (patch)
treec0cbdf6e814038385bad3945b2229e7dd611eb00 /src/util_test.cc
parent0c2982d13ea290a451efa8e8ddbaa9af1e7229a1 (diff)
downloadNinja-cc8b72a87d72a030dc5b2bb212958c0e46213a6b.zip
Ninja-cc8b72a87d72a030dc5b2bb212958c0e46213a6b.tar.gz
Ninja-cc8b72a87d72a030dc5b2bb212958c0e46213a6b.tar.bz2
properly guard against slash_bits overflow
Diffstat (limited to 'src/util_test.cc')
-rw-r--r--src/util_test.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/util_test.cc b/src/util_test.cc
index 0073994..5bbf397 100644
--- a/src/util_test.cc
+++ b/src/util_test.cc
@@ -254,6 +254,34 @@ TEST(CanonicalizePath, CanonicalizeNotExceedingLen) {
EXPECT_EQ(0, strncmp("foo/bar/baz.h", buf, size));
EXPECT_EQ(2, slash_bits); // Not including the trailing one.
}
+
+TEST(CanonicalizePath, TooManyComponents) {
+ string path;
+ string err;
+ unsigned int slash_bits;
+
+ // 32 is OK.
+ path = "a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./x.h";
+ EXPECT_TRUE(CanonicalizePath(&path, &slash_bits, &err));
+
+ // Backslashes version.
+ path =
+ "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\."
+ "\\a\\.\\a\\.\\a\\.\\a\\.\\x.h";
+ EXPECT_TRUE(CanonicalizePath(&path, &slash_bits, &err));
+ EXPECT_EQ(slash_bits, 0xffff);
+
+ // 33 is not.
+ path =
+ "a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/./a/x.h";
+ EXPECT_FALSE(CanonicalizePath(&path, &slash_bits, &err));
+
+ // Backslashes version.
+ path =
+ "a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\.\\a\\."
+ "\\a\\.\\a\\.\\a\\.\\a\\.\\a\\x.h";
+ EXPECT_FALSE(CanonicalizePath(&path, &slash_bits, &err));
+}
#endif
TEST(CanonicalizePath, EmptyResult) {