host_init_verifier: check interface names directly

Previously, ServiceParser did the check, but only when it's invoked by
host_init_verifier. Host_init_verifier can do it directly, which removes
unnecessary runtime dependencies from init.

Bug: 326827772
Test: host_init_verifier detects wrong HIDL interface names.
Change-Id: I4c8bb0e89a5def7341c48c52af730795a6ee13c0
This commit is contained in:
Jooyung Han 2024-08-21 13:57:44 +09:00
parent d6790c4bc6
commit 95c4242cf6
3 changed files with 34 additions and 25 deletions

View file

@ -298,8 +298,7 @@ int main(int argc, char** argv) {
ServiceList& sl = ServiceList::GetInstance();
Parser parser;
parser.AddSectionParser("service",
std::make_unique<ServiceParser>(&sl, GetSubcontext(),
*interface_inheritance_hierarchy_map));
std::make_unique<ServiceParser>(&sl, GetSubcontext(), std::nullopt));
parser.AddSectionParser("on", std::make_unique<ActionParser>(&am, GetSubcontext()));
parser.AddSectionParser("import", std::make_unique<HostImportParser>());
@ -317,11 +316,23 @@ int main(int argc, char** argv) {
return EXIT_FAILURE;
}
}
size_t failures = parser.parse_error_count() + am.CheckAllCommands() + sl.CheckAllCommands();
if (failures > 0) {
LOG(ERROR) << "Failed to parse init scripts with " << failures << " error(s).";
return EXIT_FAILURE;
}
for (const auto& service : sl) {
if (const auto& result = CheckInterfaceInheritanceHierarchy(
service->interfaces(), *interface_inheritance_hierarchy_map);
!result.ok()) {
LOG(ERROR) << service->filename() << ": invalid interface in service '"
<< service->name() << "': " << result.error();
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}

View file

@ -39,27 +39,6 @@ std::string FQNamesToString(const std::set<FQName>& fqnames) {
return android::base::Join(fqname_strings, " ");
}
} // namespace
Result<void> CheckInterfaceInheritanceHierarchy(const std::set<std::string>& instances,
const InterfaceInheritanceHierarchyMap& hierarchy) {
std::set<FQName> interface_fqnames;
for (const std::string& instance : instances) {
// There is insufficient build-time information on AIDL interfaces to check them here
// TODO(b/139307527): Rework how services store interfaces to avoid excess string parsing
if (base::Split(instance, "/")[0] == "aidl") {
continue;
}
FqInstance fqinstance;
if (!fqinstance.setTo(instance)) {
return Error() << "Unable to parse interface instance '" << instance << "'";
}
interface_fqnames.insert(fqinstance.getFqName());
}
return CheckInterfaceInheritanceHierarchy(interface_fqnames, hierarchy);
}
Result<void> CheckInterfaceInheritanceHierarchy(const std::set<FQName>& interfaces,
const InterfaceInheritanceHierarchyMap& hierarchy) {
std::ostringstream error_stream;
@ -90,6 +69,27 @@ Result<void> CheckInterfaceInheritanceHierarchy(const std::set<FQName>& interfac
return {};
}
} // namespace
Result<void> CheckInterfaceInheritanceHierarchy(const std::set<std::string>& instances,
const InterfaceInheritanceHierarchyMap& hierarchy) {
std::set<FQName> interface_fqnames;
for (const std::string& instance : instances) {
// There is insufficient build-time information on AIDL interfaces to check them here
// TODO(b/139307527): Rework how services store interfaces to avoid excess string parsing
if (base::Split(instance, "/")[0] == "aidl") {
continue;
}
FqInstance fqinstance;
if (!fqinstance.setTo(instance)) {
return Error() << "Unable to parse interface instance '" << instance << "'";
}
interface_fqnames.insert(fqinstance.getFqName());
}
return CheckInterfaceInheritanceHierarchy(interface_fqnames, hierarchy);
}
std::optional<std::set<FQName>> known_interfaces;
void SetKnownInterfaces(const InterfaceInheritanceHierarchyMap& hierarchy) {

View file

@ -34,8 +34,6 @@ using InterfaceInheritanceHierarchyMap = std::map<android::FQName, std::set<andr
// interface set. Uses the provided hierarchy data.
Result<void> CheckInterfaceInheritanceHierarchy(const std::set<std::string>& instances,
const InterfaceInheritanceHierarchyMap& hierarchy);
Result<void> CheckInterfaceInheritanceHierarchy(const std::set<android::FQName>& interfaces,
const InterfaceInheritanceHierarchyMap& hierarchy);
// Saves the set of known interfaces using the provided HIDL interface
// inheritance hierarchy.