Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14b65736 authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Use ' quoting to escape arguments."

parents eb7d308a 5498adef
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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;
}
+24 −24
Original line number Diff line number Diff line
@@ -25,28 +25,28 @@ TEST(adb_utils, directory_exists) {
}

TEST(adb_utils, 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\ 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"('')", 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 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)"));
}