diff options
author | Daniel Norman <danielnorman@google.com> | 2019-06-27 12:18:08 -0700 |
---|---|---|
committer | Daniel Norman <danielnorman@google.com> | 2019-06-28 13:31:54 -0700 |
commit | 3df8dc58b2b5b1f60d45793e6a7c1f51a2fd2383 (patch) | |
tree | a888e3b89fc5abe85c0c2f9f7352f7f10424ced2 /init/host_init_verifier.cpp | |
parent | c4117afdc9144e925bfb663d25c15a16b0700842 (diff) |
Checks each interface in an init_rc file is a known hidl_interface.
Test: Adding a misspelling to an init_rc's interface line and observing
build failure.
Bug: 77646540
Change-Id: I58f66d73f0bd9b4203e8259161843b56ad428d73
Diffstat (limited to 'init/host_init_verifier.cpp')
-rw-r--r-- | init/host_init_verifier.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/init/host_init_verifier.cpp b/init/host_init_verifier.cpp index 9323aa043..8aa350950 100644 --- a/init/host_init_verifier.cpp +++ b/init/host_init_verifier.cpp @@ -129,6 +129,23 @@ passwd* getpwnam(const char* login) { // NOLINT: implementing bad function. return nullptr; } +static std::optional<std::set<std::string>> ReadKnownInterfaces( + const std::string& known_interfaces_file) { + if (known_interfaces_file.empty()) { + LOG(WARNING) << "Missing a known interfaces file."; + return {}; + } + + std::string known_interfaces; + if (!ReadFileToString(known_interfaces_file, &known_interfaces)) { + LOG(ERROR) << "Failed to read known interfaces file '" << known_interfaces_file << "'"; + return {}; + } + + auto interfaces = Split(known_interfaces, " "); + return std::set<std::string>(interfaces.begin(), interfaces.end()); +} + namespace android { namespace init { @@ -139,11 +156,12 @@ static Result<void> do_stub(const BuiltinArguments& args) { #include "generated_stub_builtin_function_map.h" void PrintUsage() { - std::cout << "usage: host_init_verifier [-p FILE] <init rc file>\n" + std::cout << "usage: host_init_verifier [-p FILE] -k FILE <init rc file>\n" "\n" "Tests an init script for correctness\n" "\n" "-p FILE\tSearch this passwd file for users and groups\n" + "-k FILE\tUse this file as a space-separated list of known interfaces\n" << std::endl; } @@ -151,13 +169,15 @@ int main(int argc, char** argv) { android::base::InitLogging(argv, &android::base::StdioLogger); android::base::SetMinimumLogSeverity(android::base::ERROR); + std::string known_interfaces_file; + while (true) { static const struct option long_options[] = { {"help", no_argument, nullptr, 'h'}, {nullptr, 0, nullptr, 0}, }; - int arg = getopt_long(argc, argv, "p:", long_options, nullptr); + int arg = getopt_long(argc, argv, "p:k:", long_options, nullptr); if (arg == -1) { break; @@ -170,6 +190,9 @@ int main(int argc, char** argv) { case 'p': passwd_files.emplace_back(optarg); break; + case 'k': + known_interfaces_file = optarg; + break; default: std::cerr << "getprop: getopt returned invalid result: " << arg << std::endl; return EXIT_FAILURE; @@ -189,7 +212,9 @@ int main(int argc, char** argv) { ActionManager& am = ActionManager::GetInstance(); ServiceList& sl = ServiceList::GetInstance(); Parser parser; - parser.AddSectionParser("service", std::make_unique<ServiceParser>(&sl, nullptr)); + parser.AddSectionParser( + "service", std::make_unique<ServiceParser>(&sl, nullptr, + ReadKnownInterfaces(known_interfaces_file))); parser.AddSectionParser("on", std::make_unique<ActionParser>(&am, nullptr)); parser.AddSectionParser("import", std::make_unique<HostImportParser>()); |