summaryrefslogtreecommitdiffstats
path: root/applypatch
diff options
context:
space:
mode:
Diffstat (limited to 'applypatch')
-rw-r--r--applypatch/applypatch.cpp35
-rw-r--r--applypatch/applypatch_modes.cpp77
-rw-r--r--applypatch/imgpatch.cpp14
-rw-r--r--applypatch/include/applypatch/applypatch.h7
4 files changed, 69 insertions, 64 deletions
diff --git a/applypatch/applypatch.cpp b/applypatch/applypatch.cpp
index e6fd5f6ae..b1f5607a6 100644
--- a/applypatch/applypatch.cpp
+++ b/applypatch/applypatch.cpp
@@ -376,24 +376,26 @@ static int FindMatchingPatch(const uint8_t* sha1, const std::vector<std::string>
return -1;
}
-int applypatch_check(const char* filename, const std::vector<std::string>& patch_sha1s) {
- // It's okay to specify no SHA-1s; the check will pass if the LoadFileContents is successful.
- // (Useful for reading partitions, where the filename encodes the SHA-1s; no need to check them
- // twice.)
+int applypatch_check(const std::string& filename, const std::vector<std::string>& sha1s) {
+ if (!android::base::StartsWith(filename, "EMMC:")) {
+ return 1;
+ }
+
+ // The check will pass if LoadPartitionContents is successful, because the filename already
+ // encodes the desired SHA-1s.
FileContents file;
- if (LoadFileContents(filename, &file) != 0 ||
- (!patch_sha1s.empty() && FindMatchingPatch(file.sha1, patch_sha1s) < 0)) {
+ if (LoadPartitionContents(filename, &file) != 0) {
LOG(INFO) << "\"" << filename << "\" doesn't have any of expected SHA-1 sums; checking cache";
- // If the source file is missing or corrupted, it might be because we were killed in the middle
- // of patching it. A copy should have been made in cache_temp_source. If that file exists and
- // matches the SHA-1 we're looking for, the check still passes.
+ // If the partition is corrupted, it might be because we were killed in the middle of patching
+ // it. A copy should have been made in cache_temp_source. If that file exists and matches the
+ // SHA-1 we're looking for, the check still passes.
if (LoadFileContents(Paths::Get().cache_temp_source(), &file) != 0) {
LOG(ERROR) << "Failed to load cache file";
return 1;
}
- if (FindMatchingPatch(file.sha1, patch_sha1s) < 0) {
+ if (FindMatchingPatch(file.sha1, sha1s) < 0) {
LOG(ERROR) << "The cache bits don't match any SHA-1 for \"" << filename << "\"";
return 1;
}
@@ -551,7 +553,7 @@ int applypatch_flash(const char* source_filename, const char* target_filename,
static int GenerateTarget(const FileContents& source_file, const std::unique_ptr<Value>& patch,
const std::string& target_filename,
const uint8_t target_sha1[SHA_DIGEST_LENGTH], const Value* bonus_data) {
- if (patch->type != VAL_BLOB) {
+ if (patch->type != Value::Type::BLOB) {
LOG(ERROR) << "patch is not a blob";
return 1;
}
@@ -622,10 +624,13 @@ static int GenerateTarget(const FileContents& source_file, const std::unique_ptr
SHA1(reinterpret_cast<const uint8_t*>(patch->data.data()), patch->data.size(), patch_digest);
LOG(ERROR) << "patch size " << patch->data.size() << " SHA-1 " << short_sha1(patch_digest);
- uint8_t bonus_digest[SHA_DIGEST_LENGTH];
- SHA1(reinterpret_cast<const uint8_t*>(bonus_data->data.data()), bonus_data->data.size(),
- bonus_digest);
- LOG(ERROR) << "bonus size " << bonus_data->data.size() << " SHA-1 " << short_sha1(bonus_digest);
+ if (bonus_data != nullptr) {
+ uint8_t bonus_digest[SHA_DIGEST_LENGTH];
+ SHA1(reinterpret_cast<const uint8_t*>(bonus_data->data.data()), bonus_data->data.size(),
+ bonus_digest);
+ LOG(ERROR) << "bonus size " << bonus_data->data.size() << " SHA-1 "
+ << short_sha1(bonus_digest);
+ }
// TODO(b/67849209) Remove after debugging the unit test flakiness.
if (android::base::GetMinimumLogSeverity() <= android::base::LogSeverity::DEBUG) {
diff --git a/applypatch/applypatch_modes.cpp b/applypatch/applypatch_modes.cpp
index 6437e1be6..ec95325fc 100644
--- a/applypatch/applypatch_modes.cpp
+++ b/applypatch/applypatch_modes.cpp
@@ -81,52 +81,51 @@ static int FlashMode(const char* src_filename, const char* tgt_filename,
}
static int PatchMode(int argc, const char** argv) {
- FileContents bonusFc;
- Value bonus(VAL_INVALID, "");
-
- if (argc >= 3 && strcmp(argv[1], "-b") == 0) {
- if (LoadFileContents(argv[2], &bonusFc) != 0) {
- LOG(ERROR) << "Failed to load bonus file " << argv[2];
- return 1;
- }
- bonus.type = VAL_BLOB;
- bonus.data = std::string(bonusFc.data.cbegin(), bonusFc.data.cend());
- argc -= 2;
- argv += 2;
- }
-
- if (argc < 4) {
- return 2;
- }
-
- size_t target_size;
- if (!android::base::ParseUint(argv[4], &target_size) || target_size == 0) {
- LOG(ERROR) << "Failed to parse \"" << argv[4] << "\" as byte count";
+ std::unique_ptr<Value> bonus;
+ if (argc >= 3 && strcmp(argv[1], "-b") == 0) {
+ FileContents bonus_fc;
+ if (LoadFileContents(argv[2], &bonus_fc) != 0) {
+ LOG(ERROR) << "Failed to load bonus file " << argv[2];
return 1;
}
+ bonus = std::make_unique<Value>(Value::Type::BLOB,
+ std::string(bonus_fc.data.cbegin(), bonus_fc.data.cend()));
+ argc -= 2;
+ argv += 2;
+ }
- // If no <src-sha1>:<patch> is provided, it is in flash mode.
- if (argc == 5) {
- if (bonus.type != VAL_INVALID) {
- LOG(ERROR) << "bonus file not supported in flash mode";
- return 1;
- }
- return FlashMode(argv[1], argv[2], argv[3], target_size);
- }
+ if (argc < 4) {
+ return 2;
+ }
- std::vector<std::string> sha1s;
- std::vector<FileContents> files;
- if (!ParsePatchArgs(argc-5, argv+5, &sha1s, &files)) {
- LOG(ERROR) << "Failed to parse patch args";
+ size_t target_size;
+ if (!android::base::ParseUint(argv[4], &target_size) || target_size == 0) {
+ LOG(ERROR) << "Failed to parse \"" << argv[4] << "\" as byte count";
+ return 1;
+ }
+
+ // If no <src-sha1>:<patch> is provided, it is in flash mode.
+ if (argc == 5) {
+ if (bonus) {
+ LOG(ERROR) << "bonus file not supported in flash mode";
return 1;
}
+ return FlashMode(argv[1], argv[2], argv[3], target_size);
+ }
- std::vector<std::unique_ptr<Value>> patches;
- for (size_t i = 0; i < files.size(); ++i) {
- patches.push_back(std::make_unique<Value>(
- VAL_BLOB, std::string(files[i].data.cbegin(), files[i].data.cend())));
- }
- return applypatch(argv[1], argv[2], argv[3], target_size, sha1s, patches, &bonus);
+ std::vector<std::string> sha1s;
+ std::vector<FileContents> files;
+ if (!ParsePatchArgs(argc - 5, argv + 5, &sha1s, &files)) {
+ LOG(ERROR) << "Failed to parse patch args";
+ return 1;
+ }
+
+ std::vector<std::unique_ptr<Value>> patches;
+ for (const auto& file : files) {
+ patches.push_back(std::make_unique<Value>(Value::Type::BLOB,
+ std::string(file.data.cbegin(), file.data.cend())));
+ }
+ return applypatch(argv[1], argv[2], argv[3], target_size, sha1s, patches, bonus.get());
}
// This program (applypatch) applies binary patches to files in a way that
diff --git a/applypatch/imgpatch.cpp b/applypatch/imgpatch.cpp
index 2f8f4851d..da7569219 100644
--- a/applypatch/imgpatch.cpp
+++ b/applypatch/imgpatch.cpp
@@ -151,7 +151,8 @@ static bool ApplyBSDiffPatchAndStreamOutput(const uint8_t* src_data, size_t src_
int ApplyImagePatch(const unsigned char* old_data, size_t old_size, const unsigned char* patch_data,
size_t patch_size, SinkFn sink) {
- Value patch(VAL_BLOB, std::string(reinterpret_cast<const char*>(patch_data), patch_size));
+ Value patch(Value::Type::BLOB,
+ std::string(reinterpret_cast<const char*>(patch_data), patch_size));
return ApplyImagePatch(old_data, old_size, patch, sink, nullptr);
}
@@ -246,11 +247,10 @@ int ApplyImagePatch(const unsigned char* old_data, size_t old_size, const Value&
// Decompress the source data; the chunk header tells us exactly
// how big we expect it to be when decompressed.
- // Note: expanded_len will include the bonus data size if
- // the patch was constructed with bonus data. The
- // deflation will come up 'bonus_size' bytes short; these
- // must be appended from the bonus_data value.
- size_t bonus_size = (i == 1 && bonus_data != NULL) ? bonus_data->data.size() : 0;
+ // Note: expanded_len will include the bonus data size if the patch was constructed with
+ // bonus data. The deflation will come up 'bonus_size' bytes short; these must be appended
+ // from the bonus_data value.
+ size_t bonus_size = (i == 1 && bonus_data != nullptr) ? bonus_data->data.size() : 0;
std::vector<unsigned char> expanded_source(expanded_len);
@@ -288,7 +288,7 @@ int ApplyImagePatch(const unsigned char* old_data, size_t old_size, const Value&
inflateEnd(&strm);
if (bonus_size) {
- memcpy(expanded_source.data() + (expanded_len - bonus_size), &bonus_data->data[0],
+ memcpy(expanded_source.data() + (expanded_len - bonus_size), bonus_data->data.data(),
bonus_size);
}
}
diff --git a/applypatch/include/applypatch/applypatch.h b/applypatch/include/applypatch/applypatch.h
index f074e3681..92db59c3a 100644
--- a/applypatch/include/applypatch/applypatch.h
+++ b/applypatch/include/applypatch/applypatch.h
@@ -78,9 +78,10 @@ int applypatch(const char* source_filename, const char* target_filename,
const std::vector<std::string>& patch_sha1s,
const std::vector<std::unique_ptr<Value>>& patch_data, const Value* bonus_data);
-// Returns 0 if the contents of the file or the cached file match any of the given SHA-1's. Returns
-// nonzero otherwise.
-int applypatch_check(const char* filename, const std::vector<std::string>& patch_sha1s);
+// Returns 0 if the contents of the eMMC target or the cached file match any of the given SHA-1's.
+// Returns nonzero otherwise. 'filename' must refer to an eMMC partition target. It would only use
+// 'sha1s' to find a match on /cache if the hashes embedded in the filename fail to match.
+int applypatch_check(const std::string& filename, const std::vector<std::string>& sha1s);
// Flashes a given image to the target partition. It verifies the target cheksum first, and will
// return if target already has the desired hash. Otherwise it checks the checksum of the given