am a9caadf8: am 14b65736: Merge "Use \' quoting to escape arguments."

* commit 'a9caadf8bd291d3e2479d46960bfe225f9914a8b':
  Use ' quoting to escape arguments.
This commit is contained in:
Elliott Hughes 2015-04-21 23:03:16 +00:00 committed by Android Git Automerger
commit 4184a72c4e
2 changed files with 27 additions and 28 deletions

View File

@ -35,19 +35,18 @@ bool directory_exists(const std::string& path) {
return lstat(path.c_str(), &sb) != -1 && S_ISDIR(sb.st_mode);
}
static bool should_escape(const char c) {
return (c == ' ' || c == '\'' || c == '"' || c == '\\' || c == '(' || c == ')');
}
std::string escape_arg(const std::string& s) {
// Preserve empty arguments.
if (s.empty()) return "\"\"";
std::string result = s;
std::string result(s);
// Insert a \ before any ' in the string.
for (auto it = result.begin(); it != result.end(); ++it) {
if (should_escape(*it)) {
if (*it == '\'') {
it = result.insert(it, '\\') + 1;
}
}
// Prefix and suffix the whole string with '.
result.insert(result.begin(), '\'');
result.push_back('\'');
return result;
}

View File

@ -25,28 +25,28 @@ TEST(adb_utils, directory_exists) {
}
TEST(adb_utils, escape_arg) {
ASSERT_EQ(R"("")", escape_arg(""));
ASSERT_EQ(R"('')", escape_arg(""));
ASSERT_EQ(R"(abc)", escape_arg("abc"));
ASSERT_EQ(R"('abc')", escape_arg("abc"));
ASSERT_EQ(R"(\ abc)", escape_arg(" abc"));
ASSERT_EQ(R"(\'abc)", escape_arg("'abc"));
ASSERT_EQ(R"(\"abc)", escape_arg("\"abc"));
ASSERT_EQ(R"(\\abc)", escape_arg("\\abc"));
ASSERT_EQ(R"(\(abc)", escape_arg("(abc"));
ASSERT_EQ(R"(\)abc)", escape_arg(")abc"));
ASSERT_EQ(R"(' abc')", escape_arg(" abc"));
ASSERT_EQ(R"('\'abc')", escape_arg("'abc"));
ASSERT_EQ(R"('"abc')", escape_arg("\"abc"));
ASSERT_EQ(R"('\abc')", escape_arg("\\abc"));
ASSERT_EQ(R"('(abc')", escape_arg("(abc"));
ASSERT_EQ(R"(')abc')", escape_arg(")abc"));
ASSERT_EQ(R"(abc\ abc)", escape_arg("abc abc"));
ASSERT_EQ(R"(abc\'abc)", escape_arg("abc'abc"));
ASSERT_EQ(R"(abc\"abc)", escape_arg("abc\"abc"));
ASSERT_EQ(R"(abc\\abc)", escape_arg("abc\\abc"));
ASSERT_EQ(R"(abc\(abc)", escape_arg("abc(abc"));
ASSERT_EQ(R"(abc\)abc)", escape_arg("abc)abc"));
ASSERT_EQ(R"('abc abc')", escape_arg("abc abc"));
ASSERT_EQ(R"('abc\'abc')", escape_arg("abc'abc"));
ASSERT_EQ(R"('abc"abc')", escape_arg("abc\"abc"));
ASSERT_EQ(R"('abc\abc')", escape_arg("abc\\abc"));
ASSERT_EQ(R"('abc(abc')", escape_arg("abc(abc"));
ASSERT_EQ(R"('abc)abc')", escape_arg("abc)abc"));
ASSERT_EQ(R"(abc\ )", escape_arg("abc "));
ASSERT_EQ(R"(abc\')", escape_arg("abc'"));
ASSERT_EQ(R"(abc\")", escape_arg("abc\""));
ASSERT_EQ(R"(abc\\)", escape_arg("abc\\"));
ASSERT_EQ(R"(abc\()", escape_arg("abc("));
ASSERT_EQ(R"(abc\))", escape_arg("abc)"));
ASSERT_EQ(R"('abc ')", escape_arg("abc "));
ASSERT_EQ(R"('abc\'')", escape_arg("abc'"));
ASSERT_EQ(R"('abc"')", escape_arg("abc\""));
ASSERT_EQ(R"('abc\')", escape_arg("abc\\"));
ASSERT_EQ(R"('abc(')", escape_arg("abc("));
ASSERT_EQ(R"('abc)')", escape_arg("abc)"));
}