Merge "applypatch: Add backup_source parameter to PatchPartition." am: 86b54dc493
am: 164f4759a2
Change-Id: I0d4bc6a5ec15265889e6df57ebdb0ee7c4ed64ca
This commit is contained in:
@@ -47,7 +47,7 @@
|
|||||||
using namespace std::string_literals;
|
using namespace std::string_literals;
|
||||||
|
|
||||||
static bool GenerateTarget(const Partition& target, const FileContents& source_file,
|
static bool GenerateTarget(const Partition& target, const FileContents& source_file,
|
||||||
const Value& patch, const Value* bonus_data);
|
const Value& patch, const Value* bonus_data, bool backup_source);
|
||||||
|
|
||||||
bool LoadFileContents(const std::string& filename, FileContents* file) {
|
bool LoadFileContents(const std::string& filename, FileContents* file) {
|
||||||
// No longer allow loading contents from eMMC partitions.
|
// No longer allow loading contents from eMMC partitions.
|
||||||
@@ -266,7 +266,7 @@ int ShowLicenses() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool PatchPartition(const Partition& target, const Partition& source, const Value& patch,
|
bool PatchPartition(const Partition& target, const Partition& source, const Value& patch,
|
||||||
const Value* bonus) {
|
const Value* bonus, bool backup_source) {
|
||||||
LOG(INFO) << "Patching " << target.name;
|
LOG(INFO) << "Patching " << target.name;
|
||||||
|
|
||||||
// We try to load and check against the target hash first.
|
// We try to load and check against the target hash first.
|
||||||
@@ -280,7 +280,7 @@ bool PatchPartition(const Partition& target, const Partition& source, const Valu
|
|||||||
|
|
||||||
FileContents source_file;
|
FileContents source_file;
|
||||||
if (ReadPartitionToBuffer(source, &source_file, true)) {
|
if (ReadPartitionToBuffer(source, &source_file, true)) {
|
||||||
return GenerateTarget(target, source_file, patch, bonus);
|
return GenerateTarget(target, source_file, patch, bonus, backup_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG(ERROR) << "Failed to find any match";
|
LOG(ERROR) << "Failed to find any match";
|
||||||
@@ -326,7 +326,7 @@ bool FlashPartition(const Partition& partition, const std::string& source_filena
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool GenerateTarget(const Partition& target, const FileContents& source_file,
|
static bool GenerateTarget(const Partition& target, const FileContents& source_file,
|
||||||
const Value& patch, const Value* bonus_data) {
|
const Value& patch, const Value* bonus_data, bool backup_source) {
|
||||||
uint8_t expected_sha1[SHA_DIGEST_LENGTH];
|
uint8_t expected_sha1[SHA_DIGEST_LENGTH];
|
||||||
if (ParseSha1(target.hash, expected_sha1) != 0) {
|
if (ParseSha1(target.hash, expected_sha1) != 0) {
|
||||||
LOG(ERROR) << "Failed to parse target hash \"" << target.hash << "\"";
|
LOG(ERROR) << "Failed to parse target hash \"" << target.hash << "\"";
|
||||||
@@ -351,11 +351,11 @@ static bool GenerateTarget(const Partition& target, const FileContents& source_f
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We write the original source to cache, in case the partition write is interrupted.
|
// We write the original source to cache, in case the partition write is interrupted.
|
||||||
if (!CheckAndFreeSpaceOnCache(source_file.data.size())) {
|
if (backup_source && !CheckAndFreeSpaceOnCache(source_file.data.size())) {
|
||||||
LOG(ERROR) << "Not enough free space on /cache";
|
LOG(ERROR) << "Not enough free space on /cache";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!SaveFileContents(Paths::Get().cache_temp_source(), &source_file)) {
|
if (backup_source && !SaveFileContents(Paths::Get().cache_temp_source(), &source_file)) {
|
||||||
LOG(ERROR) << "Failed to back up source file";
|
LOG(ERROR) << "Failed to back up source file";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -415,7 +415,9 @@ static bool GenerateTarget(const Partition& target, const FileContents& source_f
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete the backup copy of the source.
|
// Delete the backup copy of the source.
|
||||||
unlink(Paths::Get().cache_temp_source().c_str());
|
if (backup_source) {
|
||||||
|
unlink(Paths::Get().cache_temp_source().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
// Success!
|
// Success!
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ static int PatchMode(const std::string& target_emmc, const std::string& source_e
|
|||||||
bonus = std::make_unique<Value>(Value::Type::BLOB, std::move(bonus_contents));
|
bonus = std::make_unique<Value>(Value::Type::BLOB, std::move(bonus_contents));
|
||||||
}
|
}
|
||||||
|
|
||||||
return PatchPartition(target, source, patch, bonus.get()) ? 0 : 1;
|
return PatchPartition(target, source, patch, bonus.get(), false) ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Usage() {
|
static void Usage() {
|
||||||
|
|||||||
@@ -73,10 +73,11 @@ std::ostream& operator<<(std::ostream& os, const Partition& partition);
|
|||||||
// the 'target' Partition. While patching, it will backup the data on the source partition to
|
// the 'target' Partition. While patching, it will backup the data on the source partition to
|
||||||
// /cache, so that the patching could be resumed on interruption even if both of the source and
|
// /cache, so that the patching could be resumed on interruption even if both of the source and
|
||||||
// target partitions refer to the same device. The function is idempotent if called multiple times.
|
// target partitions refer to the same device. The function is idempotent if called multiple times.
|
||||||
// An optional arg 'bonus' can be provided, if the patch was generated with a bonus output.
|
// 'bonus' can be provided if the patch was generated with a bonus output, or nullptr.
|
||||||
// Returns the patching result.
|
// 'backup_source' indicates whether the source partition should be backed up prior to the update
|
||||||
|
// (e.g. when doing in-place update). Returns the patching result.
|
||||||
bool PatchPartition(const Partition& target, const Partition& source, const Value& patch,
|
bool PatchPartition(const Partition& target, const Partition& source, const Value& patch,
|
||||||
const Value* bonus);
|
const Value* bonus, bool backup_source);
|
||||||
|
|
||||||
// Returns whether the contents of the eMMC target or the cached file match the embedded hash.
|
// Returns whether the contents of the eMMC target or the cached file match the embedded hash.
|
||||||
// It will look for the backup on /cache if the given partition doesn't match the checksum.
|
// It will look for the backup on /cache if the given partition doesn't match the checksum.
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ TEST_F(ApplyPatchTest, PatchPartition) {
|
|||||||
ASSERT_TRUE(LoadFileContents(from_testdata_base("bonus.file"), &bonus_fc));
|
ASSERT_TRUE(LoadFileContents(from_testdata_base("bonus.file"), &bonus_fc));
|
||||||
Value bonus(Value::Type::BLOB, std::string(bonus_fc.data.cbegin(), bonus_fc.data.cend()));
|
Value bonus(Value::Type::BLOB, std::string(bonus_fc.data.cbegin(), bonus_fc.data.cend()));
|
||||||
|
|
||||||
ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, &bonus));
|
ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, &bonus, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests patching an eMMC target without a separate bonus file (i.e. recovery-from-boot patch has
|
// Tests patching an eMMC target without a separate bonus file (i.e. recovery-from-boot patch has
|
||||||
@@ -151,7 +151,7 @@ TEST_F(ApplyPatchTest, PatchPartitionWithoutBonusFile) {
|
|||||||
ASSERT_TRUE(LoadFileContents(from_testdata_base("recovery-from-boot-with-bonus.p"), &patch_fc));
|
ASSERT_TRUE(LoadFileContents(from_testdata_base("recovery-from-boot-with-bonus.p"), &patch_fc));
|
||||||
Value patch(Value::Type::BLOB, std::string(patch_fc.data.cbegin(), patch_fc.data.cend()));
|
Value patch(Value::Type::BLOB, std::string(patch_fc.data.cbegin(), patch_fc.data.cend()));
|
||||||
|
|
||||||
ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, nullptr));
|
ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, nullptr, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
class FreeCacheTest : public ::testing::Test {
|
class FreeCacheTest : public ::testing::Test {
|
||||||
|
|||||||
+1
-1
@@ -271,7 +271,7 @@ Value* PatchPartitionFn(const char* name, State* state,
|
|||||||
return StringValue("");
|
return StringValue("");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result = PatchPartition(target, source, *values[0], nullptr);
|
bool result = PatchPartition(target, source, *values[0], nullptr, true);
|
||||||
return StringValue(result ? "t" : "");
|
return StringValue(result ? "t" : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user