Merge "Update_verifier: Remove the support for legacy text format CareMap"
This commit is contained in:
commit
223879ce4b
3 changed files with 6 additions and 88 deletions
|
@ -98,7 +98,7 @@ TEST_F(UpdateVerifierTest, verify_image_no_care_map) {
|
||||||
ASSERT_FALSE(verifier_.ParseCareMap());
|
ASSERT_FALSE(verifier_.ParseCareMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(UpdateVerifierTest, verify_image_smoke) {
|
TEST_F(UpdateVerifierTest, verify_image_text_format) {
|
||||||
// This test relies on dm-verity support.
|
// This test relies on dm-verity support.
|
||||||
if (!verity_supported) {
|
if (!verity_supported) {
|
||||||
GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support.";
|
GTEST_LOG_(INFO) << "Test skipped on devices without dm-verity support.";
|
||||||
|
@ -107,52 +107,14 @@ TEST_F(UpdateVerifierTest, verify_image_smoke) {
|
||||||
|
|
||||||
std::string content = "system\n2,0,1";
|
std::string content = "system\n2,0,1";
|
||||||
ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_));
|
ASSERT_TRUE(android::base::WriteStringToFile(content, care_map_txt_));
|
||||||
ASSERT_TRUE(verifier_.ParseCareMap());
|
// CareMap in text format is no longer supported.
|
||||||
ASSERT_TRUE(verifier_.VerifyPartitions());
|
ASSERT_FALSE(verifier_.ParseCareMap());
|
||||||
|
|
||||||
// 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) {
|
TEST_F(UpdateVerifierTest, verify_image_empty_care_map) {
|
||||||
ASSERT_FALSE(verifier_.ParseCareMap());
|
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_));
|
|
||||||
ASSERT_FALSE(verifier_.ParseCareMap());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(UpdateVerifierTest, verify_image_protobuf_care_map_smoke) {
|
TEST_F(UpdateVerifierTest, verify_image_protobuf_care_map_smoke) {
|
||||||
// This test relies on dm-verity support.
|
// This test relies on dm-verity support.
|
||||||
if (!verity_supported) {
|
if (!verity_supported) {
|
||||||
|
|
|
@ -50,9 +50,6 @@ class UpdateVerifier {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class UpdateVerifierTest;
|
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>.
|
// Finds all the dm-enabled partitions, and returns a map of <partition_name, block_device>.
|
||||||
std::map<std::string, std::string> FindDmPartitions();
|
std::map<std::string, std::string> FindDmPartitions();
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,7 @@ using android::hardware::boot::V1_0::IBootControl;
|
||||||
using android::hardware::boot::V1_0::BoolResult;
|
using android::hardware::boot::V1_0::BoolResult;
|
||||||
using android::hardware::boot::V1_0::CommandResult;
|
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";
|
constexpr const char* kDefaultCareMapPrefix = "/data/ota_package/care_map";
|
||||||
|
|
||||||
// Find directories in format of "/sys/block/dm-X".
|
// Find directories in format of "/sys/block/dm-X".
|
||||||
|
@ -196,51 +197,13 @@ bool UpdateVerifier::VerifyPartitions() {
|
||||||
return true;
|
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() {
|
bool UpdateVerifier::ParseCareMap() {
|
||||||
partition_map_.clear();
|
partition_map_.clear();
|
||||||
|
|
||||||
std::string care_map_name = care_map_prefix_ + ".pb";
|
std::string care_map_name = care_map_prefix_ + ".pb";
|
||||||
if (access(care_map_name.c_str(), R_OK) == -1) {
|
if (access(care_map_name.c_str(), R_OK) == -1) {
|
||||||
LOG(WARNING) << care_map_name
|
LOG(ERROR) << care_map_name << " doesn't exist";
|
||||||
<< " doesn't exist, falling back to read the care_map in plain text format.";
|
return false;
|
||||||
care_map_name = care_map_prefix_ + ".txt";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android::base::unique_fd care_map_fd(TEMP_FAILURE_RETRY(open(care_map_name.c_str(), O_RDONLY)));
|
android::base::unique_fd care_map_fd(TEMP_FAILURE_RETRY(open(care_map_name.c_str(), O_RDONLY)));
|
||||||
|
@ -263,10 +226,6 @@ bool UpdateVerifier::ParseCareMap() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (android::base::EndsWith(care_map_name, ".txt")) {
|
|
||||||
return ParseCareMapPlainText(file_content);
|
|
||||||
}
|
|
||||||
|
|
||||||
recovery_update_verifier::CareMap care_map;
|
recovery_update_verifier::CareMap care_map;
|
||||||
if (!care_map.ParseFromString(file_content)) {
|
if (!care_map.ParseFromString(file_content)) {
|
||||||
LOG(WARNING) << "Failed to parse " << care_map_name << " in protobuf format.";
|
LOG(WARNING) << "Failed to parse " << care_map_name << " in protobuf format.";
|
||||||
|
|
Loading…
Reference in a new issue