Loading tests/component/update_verifier_test.cpp +3 −41 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ TEST_F(UpdateVerifierTest, verify_image_no_care_map) { ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_smoke) { TEST_F(UpdateVerifierTest, verify_image_text_format) { // This test relies on dm-verity support. if (!verity_supported) { GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support."; Loading @@ -107,49 +107,11 @@ TEST_F(UpdateVerifierTest, verify_image_smoke) { std::string content = "system\n2,0,1"; ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_)); ASSERT_TRUE(verifier_.ParseCareMap()); ASSERT_TRUE(verifier_.VerifyPartitions()); // Leading and trailing newlines should be accepted. ASSERT_TRUE(android::base::WriteStringToFile("\n" + content + "\n\n", care_map_txt_)); ASSERT_TRUE(verifier_.ParseCareMap()); ASSERT_TRUE(verifier_.VerifyPartitions()); } TEST_F(UpdateVerifierTest, verify_image_empty_care_map) { // CareMap in text format is no longer supported. ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_wrong_lines) { // The care map file can have only 2 / 4 / 6 lines. ASSERT_TRUE(android::base::WriteStringToFile("line1", care_map_txt_)); ASSERT_FALSE(verifier_.ParseCareMap()); ASSERT_TRUE(android::base::WriteStringToFile("line1\nline2\nline3", care_map_txt_)); ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_malformed_care_map) { // This test relies on dm-verity support. if (!verity_supported) { GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support."; return; } std::string content = "system\n2,1,0"; ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_)); ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_legacy_care_map) { // This test relies on dm-verity support. if (!verity_supported) { GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support."; return; } std::string content = "/dev/block/bootdevice/by-name/system\n2,1,0"; ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_)); TEST_F(UpdateVerifierTest, verify_image_empty_care_map) { ASSERT_FALSE(verifier_.ParseCareMap()); } Loading update_verifier/include/update_verifier/update_verifier.h +0 −3 Original line number Diff line number Diff line Loading @@ -50,9 +50,6 @@ class UpdateVerifier { private: friend class UpdateVerifierTest; // Parses the legacy care_map.txt in plain text format. bool ParseCareMapPlainText(const std::string& content); // Finds all the dm-enabled partitions, and returns a map of <partition_name, block_device>. std::map<std::string, std::string> FindDmPartitions(); Loading update_verifier/update_verifier.cpp +3 −44 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ using android::hardware::boot::V1_0::IBootControl; using android::hardware::boot::V1_0::BoolResult; using android::hardware::boot::V1_0::CommandResult; // TODO(xunchang) remove the prefix and use a default path instead. constexpr const char* kDefaultCareMapPrefix = "/data/ota_package/care_map"; // Find directories in format of "/sys/block/dm-X". Loading Loading @@ -199,51 +200,13 @@ bool UpdateVerifier::VerifyPartitions() { return true; } bool UpdateVerifier::ParseCareMapPlainText(const std::string& content) { // care_map file has up to six lines, where every two lines make a pair. Within each pair, the // first line has the partition name (e.g. "system"), while the second line holds the ranges of // all the blocks to verify. auto lines = android::base::Split(android::base::Trim(content), "\n"); if (lines.size() != 2 && lines.size() != 4 && lines.size() != 6) { LOG(WARNING) << "Invalid lines in care_map: found " << lines.size() << " lines, expecting 2 or 4 or 6 lines."; return false; } for (size_t i = 0; i < lines.size(); i += 2) { const std::string& partition_name = lines[i]; const std::string& range_str = lines[i + 1]; // We're seeing an N care_map.txt. Skip the verification since it's not compatible with O // update_verifier (the last few metadata blocks can't be read via device mapper). if (android::base::StartsWith(partition_name, "/dev/block/")) { LOG(WARNING) << "Found legacy care_map.txt; skipped."; return false; } // For block range string, first integer 'count' equals 2 * total number of valid ranges, // followed by 'count' number comma separated integers. Every two integers reprensent a // block range with the first number included in range but second number not included. // For example '4,64536,65343,74149,74150' represents: [64536,65343) and [74149,74150). RangeSet ranges = RangeSet::Parse(range_str); if (!ranges) { LOG(WARNING) << "Error parsing RangeSet string " << range_str; return false; } partition_map_.emplace(partition_name, ranges); } return true; } bool UpdateVerifier::ParseCareMap() { partition_map_.clear(); std::string care_map_name = care_map_prefix_ + ".pb"; if (access(care_map_name.c_str(), R_OK) == -1) { LOG(WARNING) << care_map_name << " doesn't exist, falling back to read the care_map in plain text format."; care_map_name = care_map_prefix_ + ".txt"; LOG(ERROR) << care_map_name << " doesn't exist"; return false; } android::base::unique_fd care_map_fd(TEMP_FAILURE_RETRY(open(care_map_name.c_str(), O_RDONLY))); Loading @@ -266,10 +229,6 @@ bool UpdateVerifier::ParseCareMap() { return false; } if (android::base::EndsWith(care_map_name, ".txt")) { return ParseCareMapPlainText(file_content); } recovery_update_verifier::CareMap care_map; if (!care_map.ParseFromString(file_content)) { LOG(WARNING) << "Failed to parse " << care_map_name << " in protobuf format."; Loading Loading
tests/component/update_verifier_test.cpp +3 −41 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ TEST_F(UpdateVerifierTest, verify_image_no_care_map) { ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_smoke) { TEST_F(UpdateVerifierTest, verify_image_text_format) { // This test relies on dm-verity support. if (!verity_supported) { GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support."; Loading @@ -107,49 +107,11 @@ TEST_F(UpdateVerifierTest, verify_image_smoke) { std::string content = "system\n2,0,1"; ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_)); ASSERT_TRUE(verifier_.ParseCareMap()); ASSERT_TRUE(verifier_.VerifyPartitions()); // Leading and trailing newlines should be accepted. ASSERT_TRUE(android::base::WriteStringToFile("\n" + content + "\n\n", care_map_txt_)); ASSERT_TRUE(verifier_.ParseCareMap()); ASSERT_TRUE(verifier_.VerifyPartitions()); } TEST_F(UpdateVerifierTest, verify_image_empty_care_map) { // CareMap in text format is no longer supported. ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_wrong_lines) { // The care map file can have only 2 / 4 / 6 lines. ASSERT_TRUE(android::base::WriteStringToFile("line1", care_map_txt_)); ASSERT_FALSE(verifier_.ParseCareMap()); ASSERT_TRUE(android::base::WriteStringToFile("line1\nline2\nline3", care_map_txt_)); ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_malformed_care_map) { // This test relies on dm-verity support. if (!verity_supported) { GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support."; return; } std::string content = "system\n2,1,0"; ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_)); ASSERT_FALSE(verifier_.ParseCareMap()); } TEST_F(UpdateVerifierTest, verify_image_legacy_care_map) { // This test relies on dm-verity support. if (!verity_supported) { GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support."; return; } std::string content = "/dev/block/bootdevice/by-name/system\n2,1,0"; ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_)); TEST_F(UpdateVerifierTest, verify_image_empty_care_map) { ASSERT_FALSE(verifier_.ParseCareMap()); } Loading
update_verifier/include/update_verifier/update_verifier.h +0 −3 Original line number Diff line number Diff line Loading @@ -50,9 +50,6 @@ class UpdateVerifier { private: friend class UpdateVerifierTest; // Parses the legacy care_map.txt in plain text format. bool ParseCareMapPlainText(const std::string& content); // Finds all the dm-enabled partitions, and returns a map of <partition_name, block_device>. std::map<std::string, std::string> FindDmPartitions(); Loading
update_verifier/update_verifier.cpp +3 −44 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ using android::hardware::boot::V1_0::IBootControl; using android::hardware::boot::V1_0::BoolResult; using android::hardware::boot::V1_0::CommandResult; // TODO(xunchang) remove the prefix and use a default path instead. constexpr const char* kDefaultCareMapPrefix = "/data/ota_package/care_map"; // Find directories in format of "/sys/block/dm-X". Loading Loading @@ -199,51 +200,13 @@ bool UpdateVerifier::VerifyPartitions() { return true; } bool UpdateVerifier::ParseCareMapPlainText(const std::string& content) { // care_map file has up to six lines, where every two lines make a pair. Within each pair, the // first line has the partition name (e.g. "system"), while the second line holds the ranges of // all the blocks to verify. auto lines = android::base::Split(android::base::Trim(content), "\n"); if (lines.size() != 2 && lines.size() != 4 && lines.size() != 6) { LOG(WARNING) << "Invalid lines in care_map: found " << lines.size() << " lines, expecting 2 or 4 or 6 lines."; return false; } for (size_t i = 0; i < lines.size(); i += 2) { const std::string& partition_name = lines[i]; const std::string& range_str = lines[i + 1]; // We're seeing an N care_map.txt. Skip the verification since it's not compatible with O // update_verifier (the last few metadata blocks can't be read via device mapper). if (android::base::StartsWith(partition_name, "/dev/block/")) { LOG(WARNING) << "Found legacy care_map.txt; skipped."; return false; } // For block range string, first integer 'count' equals 2 * total number of valid ranges, // followed by 'count' number comma separated integers. Every two integers reprensent a // block range with the first number included in range but second number not included. // For example '4,64536,65343,74149,74150' represents: [64536,65343) and [74149,74150). RangeSet ranges = RangeSet::Parse(range_str); if (!ranges) { LOG(WARNING) << "Error parsing RangeSet string " << range_str; return false; } partition_map_.emplace(partition_name, ranges); } return true; } bool UpdateVerifier::ParseCareMap() { partition_map_.clear(); std::string care_map_name = care_map_prefix_ + ".pb"; if (access(care_map_name.c_str(), R_OK) == -1) { LOG(WARNING) << care_map_name << " doesn't exist, falling back to read the care_map in plain text format."; care_map_name = care_map_prefix_ + ".txt"; LOG(ERROR) << care_map_name << " doesn't exist"; return false; } android::base::unique_fd care_map_fd(TEMP_FAILURE_RETRY(open(care_map_name.c_str(), O_RDONLY))); Loading @@ -266,10 +229,6 @@ bool UpdateVerifier::ParseCareMap() { return false; } if (android::base::EndsWith(care_map_name, ".txt")) { return ParseCareMapPlainText(file_content); } recovery_update_verifier::CareMap care_map; if (!care_map.ParseFromString(file_content)) { LOG(WARNING) << "Failed to parse " << care_map_name << " in protobuf format."; Loading