Loading init/host_init_verifier.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -191,7 +191,7 @@ void HandlePropertyContexts(const std::string& filename, } } auto errors = std::vector<std::string>{}; auto errors = std::vector<std::string>{}; ParsePropertyInfoFile(file_contents, property_infos, &errors); ParsePropertyInfoFile(file_contents, true, property_infos, &errors); for (const auto& error : errors) { for (const auto& error : errors) { LOG(ERROR) << "Could not read line from '" << filename << "': " << error; LOG(ERROR) << "Could not read line from '" << filename << "': " << error; } } Loading init/property_service.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -925,7 +925,8 @@ bool LoadPropertyInfoFromFile(const std::string& filename, } } auto errors = std::vector<std::string>{}; auto errors = std::vector<std::string>{}; ParsePropertyInfoFile(file_contents, property_infos, &errors); bool require_prefix_or_exact = SelinuxGetVendorAndroidVersion() >= __ANDROID_API_R__; ParsePropertyInfoFile(file_contents, require_prefix_or_exact, property_infos, &errors); // Individual parsing errors are reported but do not cause a failed boot, which is what // Individual parsing errors are reported but do not cause a failed boot, which is what // returning false would do here. // returning false would do here. for (const auto& error : errors) { for (const auto& error : errors) { Loading property_service/libpropertyinfoserializer/include/property_info_serializer/property_info_serializer.h +2 −5 Original line number Original line Diff line number Diff line Loading @@ -14,8 +14,7 @@ // limitations under the License. // limitations under the License. // // #ifndef PROPERTY_INFO_SERIALIZER_H #pragma once #define PROPERTY_INFO_SERIALIZER_H #include <string> #include <string> #include <vector> #include <vector> Loading @@ -41,11 +40,9 @@ bool BuildTrie(const std::vector<PropertyInfoEntry>& property_info, const std::string& default_context, const std::string& default_type, const std::string& default_context, const std::string& default_type, std::string* serialized_trie, std::string* error); std::string* serialized_trie, std::string* error); void ParsePropertyInfoFile(const std::string& file_contents, void ParsePropertyInfoFile(const std::string& file_contents, bool require_prefix_or_exact, std::vector<PropertyInfoEntry>* property_infos, std::vector<PropertyInfoEntry>* property_infos, std::vector<std::string>* errors); std::vector<std::string>* errors); } // namespace properties } // namespace properties } // namespace android } // namespace android #endif property_service/libpropertyinfoserializer/property_info_file.cpp +16 −5 Original line number Original line Diff line number Diff line Loading @@ -56,7 +56,8 @@ bool IsTypeValid(const std::vector<std::string>& type_strings) { return false; return false; } } bool ParsePropertyInfoLine(const std::string& line, PropertyInfoEntry* out, std::string* error) { bool ParsePropertyInfoLine(const std::string& line, bool require_prefix_or_exact, PropertyInfoEntry* out, std::string* error) { auto tokenizer = SpaceTokenizer(line); auto tokenizer = SpaceTokenizer(line); auto property = tokenizer.GetNext(); auto property = tokenizer.GetNext(); Loading @@ -72,7 +73,7 @@ bool ParsePropertyInfoLine(const std::string& line, PropertyInfoEntry* out, std: } } // It is not an error to not find exact_match or a type, as older files will not contain them. // It is not an error to not find exact_match or a type, as older files will not contain them. auto exact_match = tokenizer.GetNext(); auto match_operation = tokenizer.GetNext(); // We reformat type to be space deliminated regardless of the input whitespace for easier storage // We reformat type to be space deliminated regardless of the input whitespace for easier storage // and subsequent parsing. // and subsequent parsing. auto type_strings = std::vector<std::string>{}; auto type_strings = std::vector<std::string>{}; Loading @@ -82,18 +83,27 @@ bool ParsePropertyInfoLine(const std::string& line, PropertyInfoEntry* out, std: type = tokenizer.GetNext(); type = tokenizer.GetNext(); } } bool exact_match = false; if (match_operation == "exact") { exact_match = true; } else if (match_operation != "prefix" && match_operation != "" && require_prefix_or_exact) { *error = "Match operation '" + match_operation + "' is not valid: must be either 'prefix' or 'exact'"; return false; } if (!type_strings.empty() && !IsTypeValid(type_strings)) { if (!type_strings.empty() && !IsTypeValid(type_strings)) { *error = "Type '" + Join(type_strings, " ") + "' is not valid"; *error = "Type '" + Join(type_strings, " ") + "' is not valid"; return false; return false; } } *out = {property, context, Join(type_strings, " "), exact_match == "exact"}; *out = {property, context, Join(type_strings, " "), exact_match}; return true; return true; } } } // namespace } // namespace void ParsePropertyInfoFile(const std::string& file_contents, void ParsePropertyInfoFile(const std::string& file_contents, bool require_prefix_or_exact, std::vector<PropertyInfoEntry>* property_infos, std::vector<PropertyInfoEntry>* property_infos, std::vector<std::string>* errors) { std::vector<std::string>* errors) { // Do not clear property_infos to allow this function to be called on multiple files, with // Do not clear property_infos to allow this function to be called on multiple files, with Loading @@ -108,7 +118,8 @@ void ParsePropertyInfoFile(const std::string& file_contents, auto property_info_entry = PropertyInfoEntry{}; auto property_info_entry = PropertyInfoEntry{}; auto parse_error = std::string{}; auto parse_error = std::string{}; if (!ParsePropertyInfoLine(trimmed_line, &property_info_entry, &parse_error)) { if (!ParsePropertyInfoLine(trimmed_line, require_prefix_or_exact, &property_info_entry, &parse_error)) { errors->emplace_back(parse_error); errors->emplace_back(parse_error); continue; continue; } } Loading property_service/property_info_checker/property_info_checker.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -153,7 +153,7 @@ int main(int argc, char** argv) { } } auto errors = std::vector<std::string>{}; auto errors = std::vector<std::string>{}; ParsePropertyInfoFile(file_contents, &property_info_entries, &errors); ParsePropertyInfoFile(file_contents, true, &property_info_entries, &errors); if (!errors.empty()) { if (!errors.empty()) { for (const auto& error : errors) { for (const auto& error : errors) { std::cerr << "Could not read line from '" << filename << "': " << error << std::endl; std::cerr << "Could not read line from '" << filename << "': " << error << std::endl; Loading Loading
init/host_init_verifier.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -191,7 +191,7 @@ void HandlePropertyContexts(const std::string& filename, } } auto errors = std::vector<std::string>{}; auto errors = std::vector<std::string>{}; ParsePropertyInfoFile(file_contents, property_infos, &errors); ParsePropertyInfoFile(file_contents, true, property_infos, &errors); for (const auto& error : errors) { for (const auto& error : errors) { LOG(ERROR) << "Could not read line from '" << filename << "': " << error; LOG(ERROR) << "Could not read line from '" << filename << "': " << error; } } Loading
init/property_service.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -925,7 +925,8 @@ bool LoadPropertyInfoFromFile(const std::string& filename, } } auto errors = std::vector<std::string>{}; auto errors = std::vector<std::string>{}; ParsePropertyInfoFile(file_contents, property_infos, &errors); bool require_prefix_or_exact = SelinuxGetVendorAndroidVersion() >= __ANDROID_API_R__; ParsePropertyInfoFile(file_contents, require_prefix_or_exact, property_infos, &errors); // Individual parsing errors are reported but do not cause a failed boot, which is what // Individual parsing errors are reported but do not cause a failed boot, which is what // returning false would do here. // returning false would do here. for (const auto& error : errors) { for (const auto& error : errors) { Loading
property_service/libpropertyinfoserializer/include/property_info_serializer/property_info_serializer.h +2 −5 Original line number Original line Diff line number Diff line Loading @@ -14,8 +14,7 @@ // limitations under the License. // limitations under the License. // // #ifndef PROPERTY_INFO_SERIALIZER_H #pragma once #define PROPERTY_INFO_SERIALIZER_H #include <string> #include <string> #include <vector> #include <vector> Loading @@ -41,11 +40,9 @@ bool BuildTrie(const std::vector<PropertyInfoEntry>& property_info, const std::string& default_context, const std::string& default_type, const std::string& default_context, const std::string& default_type, std::string* serialized_trie, std::string* error); std::string* serialized_trie, std::string* error); void ParsePropertyInfoFile(const std::string& file_contents, void ParsePropertyInfoFile(const std::string& file_contents, bool require_prefix_or_exact, std::vector<PropertyInfoEntry>* property_infos, std::vector<PropertyInfoEntry>* property_infos, std::vector<std::string>* errors); std::vector<std::string>* errors); } // namespace properties } // namespace properties } // namespace android } // namespace android #endif
property_service/libpropertyinfoserializer/property_info_file.cpp +16 −5 Original line number Original line Diff line number Diff line Loading @@ -56,7 +56,8 @@ bool IsTypeValid(const std::vector<std::string>& type_strings) { return false; return false; } } bool ParsePropertyInfoLine(const std::string& line, PropertyInfoEntry* out, std::string* error) { bool ParsePropertyInfoLine(const std::string& line, bool require_prefix_or_exact, PropertyInfoEntry* out, std::string* error) { auto tokenizer = SpaceTokenizer(line); auto tokenizer = SpaceTokenizer(line); auto property = tokenizer.GetNext(); auto property = tokenizer.GetNext(); Loading @@ -72,7 +73,7 @@ bool ParsePropertyInfoLine(const std::string& line, PropertyInfoEntry* out, std: } } // It is not an error to not find exact_match or a type, as older files will not contain them. // It is not an error to not find exact_match or a type, as older files will not contain them. auto exact_match = tokenizer.GetNext(); auto match_operation = tokenizer.GetNext(); // We reformat type to be space deliminated regardless of the input whitespace for easier storage // We reformat type to be space deliminated regardless of the input whitespace for easier storage // and subsequent parsing. // and subsequent parsing. auto type_strings = std::vector<std::string>{}; auto type_strings = std::vector<std::string>{}; Loading @@ -82,18 +83,27 @@ bool ParsePropertyInfoLine(const std::string& line, PropertyInfoEntry* out, std: type = tokenizer.GetNext(); type = tokenizer.GetNext(); } } bool exact_match = false; if (match_operation == "exact") { exact_match = true; } else if (match_operation != "prefix" && match_operation != "" && require_prefix_or_exact) { *error = "Match operation '" + match_operation + "' is not valid: must be either 'prefix' or 'exact'"; return false; } if (!type_strings.empty() && !IsTypeValid(type_strings)) { if (!type_strings.empty() && !IsTypeValid(type_strings)) { *error = "Type '" + Join(type_strings, " ") + "' is not valid"; *error = "Type '" + Join(type_strings, " ") + "' is not valid"; return false; return false; } } *out = {property, context, Join(type_strings, " "), exact_match == "exact"}; *out = {property, context, Join(type_strings, " "), exact_match}; return true; return true; } } } // namespace } // namespace void ParsePropertyInfoFile(const std::string& file_contents, void ParsePropertyInfoFile(const std::string& file_contents, bool require_prefix_or_exact, std::vector<PropertyInfoEntry>* property_infos, std::vector<PropertyInfoEntry>* property_infos, std::vector<std::string>* errors) { std::vector<std::string>* errors) { // Do not clear property_infos to allow this function to be called on multiple files, with // Do not clear property_infos to allow this function to be called on multiple files, with Loading @@ -108,7 +118,8 @@ void ParsePropertyInfoFile(const std::string& file_contents, auto property_info_entry = PropertyInfoEntry{}; auto property_info_entry = PropertyInfoEntry{}; auto parse_error = std::string{}; auto parse_error = std::string{}; if (!ParsePropertyInfoLine(trimmed_line, &property_info_entry, &parse_error)) { if (!ParsePropertyInfoLine(trimmed_line, require_prefix_or_exact, &property_info_entry, &parse_error)) { errors->emplace_back(parse_error); errors->emplace_back(parse_error); continue; continue; } } Loading
property_service/property_info_checker/property_info_checker.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -153,7 +153,7 @@ int main(int argc, char** argv) { } } auto errors = std::vector<std::string>{}; auto errors = std::vector<std::string>{}; ParsePropertyInfoFile(file_contents, &property_info_entries, &errors); ParsePropertyInfoFile(file_contents, true, &property_info_entries, &errors); if (!errors.empty()) { if (!errors.empty()) { for (const auto& error : errors) { for (const auto& error : errors) { std::cerr << "Could not read line from '" << filename << "': " << error << std::endl; std::cerr << "Could not read line from '" << filename << "': " << error << std::endl; Loading