Skip to content

Commit

Permalink
Update_verifier: Remove the support for legacy text format CareMap
Browse files Browse the repository at this point in the history
We have already switched to the protobuf format for new builds, and
the downgrade packages will require a data wipe. So it should be safe
to drop the support for text format.

This also helps to save the issue when users sideload a package with a
pending OTA, because the new CareMap contains the fingerprint of the
intended build.

Bug: 128536706
Test: unit tests pass, run update_verifier with legacy CareMap
Change-Id: I1c4d0e54ec591f16cc0a65dac76767725ff9e7c4
  • Loading branch information
xunchang committed Mar 13, 2019
1 parent 2a33682 commit aaa6103
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 88 deletions.
44 changes: 3 additions & 41 deletions tests/component/update_verifier_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.";
Expand All @@ -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());
}

Expand Down
3 changes: 0 additions & 3 deletions update_verifier/include/update_verifier/update_verifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
47 changes: 3 additions & 44 deletions update_verifier/update_verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,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".
Expand Down Expand Up @@ -196,51 +197,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)));
Expand All @@ -263,10 +226,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.";
Expand Down

0 comments on commit aaa6103

Please sign in to comment.