diff options
author | Nicholas Hutchinson <nshutchinson@gmail.com> | 2013-11-30 22:33:02 (GMT) |
---|---|---|
committer | Nicholas Hutchinson <nshutchinson@gmail.com> | 2014-01-06 19:30:28 (GMT) |
commit | 664edba804ddd5363299f2af5183109bdc9715b1 (patch) | |
tree | c50e267ade56530904676f103905d4a8a2ba3ba0 /src/util_test.cc | |
parent | 2517b75781decd49bc82f05f8336c509f7b2c62e (diff) | |
download | Ninja-664edba804ddd5363299f2af5183109bdc9715b1.zip Ninja-664edba804ddd5363299f2af5183109bdc9715b1.tar.gz Ninja-664edba804ddd5363299f2af5183109bdc9715b1.tar.bz2 |
More robust escaping of $in, $out paths
In summary: don’t escape if the path doesn’t contain problematic characters, otherwise:
- Shell: enclose string in single quotes, escape embedded single quotes with the magic quote-backslash-quote sequence
- Win32: Escape double quotes by doubling the number of consecutive backslashes that precede them (if any) and adding one more. Finally, double the number of trailing backslashes, and enclose the whole thing in double quotes.
Diffstat (limited to 'src/util_test.cc')
-rw-r--r-- | src/util_test.cc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/util_test.cc b/src/util_test.cc index 1e29053..f6728fb 100644 --- a/src/util_test.cc +++ b/src/util_test.cc @@ -136,6 +136,29 @@ TEST(CanonicalizePath, NotNullTerminated) { EXPECT_EQ("file ./file bar/.", string(path)); } +TEST(PathEscaping, TortureTest) { + string result; + + GetWin32EscapedString("foo bar\\\"'$@d!st!c'\\path'\\", &result); + EXPECT_EQ("\"foo bar\\\\\\\"'$@d!st!c'\\path'\\\\\"", result); + result.clear(); + + GetShellEscapedString("foo bar\"/'$@d!st!c'/path'", &result); + EXPECT_EQ("'foo bar\"/'\\''$@d!st!c'\\''/path'\\'''", result); +} + +TEST(PathEscaping, SensiblePathsAreNotNeedlesslyEscaped) { + const char* path = "some/sensible/path/without/crazy/characters.cc"; + string result; + + GetWin32EscapedString(path, &result); + EXPECT_EQ(path, result); + result.clear(); + + GetShellEscapedString(path, &result); + EXPECT_EQ(path, result); +} + TEST(StripAnsiEscapeCodes, EscapeAtEnd) { string stripped = StripAnsiEscapeCodes("foo\33"); EXPECT_EQ("foo", stripped); |