Loading applypatch/applypatch.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ using namespace std::string_literals; 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) { // No longer allow loading contents from eMMC partitions. Loading Loading @@ -266,7 +266,7 @@ int ShowLicenses() { } 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; // We try to load and check against the target hash first. Loading @@ -280,7 +280,7 @@ bool PatchPartition(const Partition& target, const Partition& source, const Valu FileContents source_file; 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"; Loading Loading @@ -326,7 +326,7 @@ bool FlashPartition(const Partition& partition, const std::string& source_filena } 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]; if (ParseSha1(target.hash, expected_sha1) != 0) { LOG(ERROR) << "Failed to parse target hash \"" << target.hash << "\""; Loading @@ -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. if (!CheckAndFreeSpaceOnCache(source_file.data.size())) { if (backup_source && !CheckAndFreeSpaceOnCache(source_file.data.size())) { LOG(ERROR) << "Not enough free space on /cache"; 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"; return false; } Loading Loading @@ -415,7 +415,9 @@ static bool GenerateTarget(const Partition& target, const FileContents& source_f } // Delete the backup copy of the source. if (backup_source) { unlink(Paths::Get().cache_temp_source().c_str()); } // Success! return true; Loading applypatch/applypatch_modes.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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)); } return PatchPartition(target, source, patch, bonus.get()) ? 0 : 1; return PatchPartition(target, source, patch, bonus.get(), false) ? 0 : 1; } static void Usage() { Loading applypatch/include/applypatch/applypatch.h +4 −3 Original line number Diff line number Diff line Loading @@ -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 // /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. // An optional arg 'bonus' can be provided, if the patch was generated with a bonus output. // Returns the patching result. // 'bonus' can be provided if the patch was generated with a bonus output, or nullptr. // '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, 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. // It will look for the backup on /cache if the given partition doesn't match the checksum. Loading tests/unit/applypatch_test.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -141,7 +141,7 @@ TEST_F(ApplyPatchTest, PatchPartition) { 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())); 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 Loading @@ -151,7 +151,7 @@ TEST_F(ApplyPatchTest, PatchPartitionWithoutBonusFile) { 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())); ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, nullptr)); ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, nullptr, false)); } class FreeCacheTest : public ::testing::Test { Loading updater/install.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -271,7 +271,7 @@ Value* PatchPartitionFn(const char* name, State* state, return StringValue(""); } bool result = PatchPartition(target, source, *values[0], nullptr); bool result = PatchPartition(target, source, *values[0], nullptr, true); return StringValue(result ? "t" : ""); } Loading Loading
applypatch/applypatch.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ using namespace std::string_literals; 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) { // No longer allow loading contents from eMMC partitions. Loading Loading @@ -266,7 +266,7 @@ int ShowLicenses() { } 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; // We try to load and check against the target hash first. Loading @@ -280,7 +280,7 @@ bool PatchPartition(const Partition& target, const Partition& source, const Valu FileContents source_file; 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"; Loading Loading @@ -326,7 +326,7 @@ bool FlashPartition(const Partition& partition, const std::string& source_filena } 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]; if (ParseSha1(target.hash, expected_sha1) != 0) { LOG(ERROR) << "Failed to parse target hash \"" << target.hash << "\""; Loading @@ -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. if (!CheckAndFreeSpaceOnCache(source_file.data.size())) { if (backup_source && !CheckAndFreeSpaceOnCache(source_file.data.size())) { LOG(ERROR) << "Not enough free space on /cache"; 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"; return false; } Loading Loading @@ -415,7 +415,9 @@ static bool GenerateTarget(const Partition& target, const FileContents& source_f } // Delete the backup copy of the source. if (backup_source) { unlink(Paths::Get().cache_temp_source().c_str()); } // Success! return true; Loading
applypatch/applypatch_modes.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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)); } return PatchPartition(target, source, patch, bonus.get()) ? 0 : 1; return PatchPartition(target, source, patch, bonus.get(), false) ? 0 : 1; } static void Usage() { Loading
applypatch/include/applypatch/applypatch.h +4 −3 Original line number Diff line number Diff line Loading @@ -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 // /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. // An optional arg 'bonus' can be provided, if the patch was generated with a bonus output. // Returns the patching result. // 'bonus' can be provided if the patch was generated with a bonus output, or nullptr. // '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, 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. // It will look for the backup on /cache if the given partition doesn't match the checksum. Loading
tests/unit/applypatch_test.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -141,7 +141,7 @@ TEST_F(ApplyPatchTest, PatchPartition) { 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())); 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 Loading @@ -151,7 +151,7 @@ TEST_F(ApplyPatchTest, PatchPartitionWithoutBonusFile) { 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())); ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, nullptr)); ASSERT_TRUE(PatchPartition(target_partition, source_partition, patch, nullptr, false)); } class FreeCacheTest : public ::testing::Test { Loading
updater/install.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -271,7 +271,7 @@ Value* PatchPartitionFn(const char* name, State* state, return StringValue(""); } bool result = PatchPartition(target, source, *values[0], nullptr); bool result = PatchPartition(target, source, *values[0], nullptr, true); return StringValue(result ? "t" : ""); } Loading