summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2018-06-20 00:56:49 +0200
committerTao Bao <tbao@google.com>2018-07-10 08:20:30 +0200
commit511d75962789837231459e53e86eaaa6a1ff6e06 (patch)
tree25e167440b5c06697a6b91640afd71be2fd965a6
parentMerge "applypatch: Restrict applypatch_check to eMMC targets." (diff)
downloadandroid_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.tar
android_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.tar.gz
android_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.tar.bz2
android_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.tar.lz
android_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.tar.xz
android_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.tar.zst
android_bootable_recovery-511d75962789837231459e53e86eaaa6a1ff6e06.zip
-rw-r--r--applypatch/applypatch.cpp2
-rw-r--r--applypatch/applypatch_modes.cpp77
-rw-r--r--applypatch/imgpatch.cpp14
-rw-r--r--edify/expr.cpp8
-rw-r--r--edify/include/edify/expr.h19
-rw-r--r--tests/component/updater_test.cpp4
-rw-r--r--updater/blockimg.cpp21
-rw-r--r--updater/install.cpp22
8 files changed, 82 insertions, 85 deletions
diff --git a/applypatch/applypatch.cpp b/applypatch/applypatch.cpp
index fc29493b4..b1f5607a6 100644
--- a/applypatch/applypatch.cpp
+++ b/applypatch/applypatch.cpp
@@ -553,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;
}
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/edify/expr.cpp b/edify/expr.cpp
index 6823b7339..c090eb28a 100644
--- a/edify/expr.cpp
+++ b/edify/expr.cpp
@@ -51,9 +51,9 @@ bool Evaluate(State* state, const std::unique_ptr<Expr>& expr, std::string* resu
if (!v) {
return false;
}
- if (v->type != VAL_STRING) {
- ErrorAbort(state, kArgsParsingFailure, "expecting string, got value type %d", v->type);
- return false;
+ if (v->type != Value::Type::STRING) {
+ ErrorAbort(state, kArgsParsingFailure, "expecting string, got value type %d", v->type);
+ return false;
}
*result = v->data;
@@ -68,7 +68,7 @@ Value* StringValue(const char* str) {
if (str == nullptr) {
return nullptr;
}
- return new Value(VAL_STRING, str);
+ return new Value(Value::Type::STRING, str);
}
Value* StringValue(const std::string& str) {
diff --git a/edify/include/edify/expr.h b/edify/include/edify/expr.h
index 770d1cf0d..ccd200778 100644
--- a/edify/include/edify/expr.h
+++ b/edify/include/edify/expr.h
@@ -53,19 +53,16 @@ struct State {
bool is_retry = false;
};
-enum ValueType {
- VAL_INVALID = -1,
- VAL_STRING = 1,
- VAL_BLOB = 2,
-};
-
struct Value {
- ValueType type;
- std::string data;
+ enum class Type {
+ STRING = 1,
+ BLOB = 2,
+ };
+
+ Value(Type type, const std::string& str) : type(type), data(str) {}
- Value(ValueType type, const std::string& str) :
- type(type),
- data(str) {}
+ Type type;
+ std::string data;
};
struct Expr;
diff --git a/tests/component/updater_test.cpp b/tests/component/updater_test.cpp
index f50e861b0..8e520f337 100644
--- a/tests/component/updater_test.cpp
+++ b/tests/component/updater_test.cpp
@@ -149,11 +149,11 @@ static Value* BlobToString(const char* name, State* state,
return nullptr;
}
- if (args[0]->type != VAL_BLOB) {
+ if (args[0]->type != Value::Type::BLOB) {
return ErrorAbort(state, kArgsParsingFailure, "%s() expects a BLOB argument", name);
}
- args[0]->type = VAL_STRING;
+ args[0]->type = Value::Type::STRING;
return args[0].release();
}
diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp
index fc713859b..6a6236b1b 100644
--- a/updater/blockimg.cpp
+++ b/updater/blockimg.cpp
@@ -1403,7 +1403,8 @@ static int PerformCommandDiff(CommandParameters& params) {
if (status == 0) {
LOG(INFO) << "patching " << blocks << " blocks to " << tgt.blocks();
Value patch_value(
- VAL_BLOB, std::string(reinterpret_cast<const char*>(params.patch_start + offset), len));
+ Value::Type::BLOB,
+ std::string(reinterpret_cast<const char*>(params.patch_start + offset), len));
RangeSinkWriter writer(params.fd, tgt);
if (params.cmdname[0] == 'i') { // imgdiff
@@ -1531,19 +1532,19 @@ static Value* PerformBlockImageUpdate(const char* name, State* state,
const std::unique_ptr<Value>& new_data_fn = args[2];
const std::unique_ptr<Value>& patch_data_fn = args[3];
- if (blockdev_filename->type != VAL_STRING) {
+ if (blockdev_filename->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "blockdev_filename argument to %s must be string", name);
return StringValue("");
}
- if (transfer_list_value->type != VAL_BLOB) {
+ if (transfer_list_value->type != Value::Type::BLOB) {
ErrorAbort(state, kArgsParsingFailure, "transfer_list argument to %s must be blob", name);
return StringValue("");
}
- if (new_data_fn->type != VAL_STRING) {
+ if (new_data_fn->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "new_data_fn argument to %s must be string", name);
return StringValue("");
}
- if (patch_data_fn->type != VAL_STRING) {
+ if (patch_data_fn->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "patch_data_fn argument to %s must be string", name);
return StringValue("");
}
@@ -1944,11 +1945,11 @@ Value* RangeSha1Fn(const char* name, State* state, const std::vector<std::unique
const std::unique_ptr<Value>& blockdev_filename = args[0];
const std::unique_ptr<Value>& ranges = args[1];
- if (blockdev_filename->type != VAL_STRING) {
+ if (blockdev_filename->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "blockdev_filename argument to %s must be string", name);
return StringValue("");
}
- if (ranges->type != VAL_STRING) {
+ if (ranges->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "ranges argument to %s must be string", name);
return StringValue("");
}
@@ -2010,7 +2011,7 @@ Value* CheckFirstBlockFn(const char* name, State* state,
const std::unique_ptr<Value>& arg_filename = args[0];
- if (arg_filename->type != VAL_STRING) {
+ if (arg_filename->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "filename argument to %s must be string", name);
return StringValue("");
}
@@ -2065,11 +2066,11 @@ Value* BlockImageRecoverFn(const char* name, State* state,
const std::unique_ptr<Value>& filename = args[0];
const std::unique_ptr<Value>& ranges = args[1];
- if (filename->type != VAL_STRING) {
+ if (filename->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "filename argument to %s must be string", name);
return StringValue("");
}
- if (ranges->type != VAL_STRING) {
+ if (ranges->type != Value::Type::STRING) {
ErrorAbort(state, kArgsParsingFailure, "ranges argument to %s must be string", name);
return StringValue("");
}
diff --git a/updater/install.cpp b/updater/install.cpp
index 9d108e0ed..02a6fe7c5 100644
--- a/updater/install.cpp
+++ b/updater/install.cpp
@@ -191,7 +191,7 @@ Value* PackageExtractFileFn(const char* name, State* state,
zip_path.c_str(), buffer.size(), ErrorCodeString(ret));
}
- return new Value(VAL_BLOB, buffer);
+ return new Value(Value::Type::BLOB, buffer);
}
}
@@ -238,10 +238,10 @@ Value* ApplyPatchFn(const char* name, State* state,
}
for (int i = 0; i < patchcount; ++i) {
- if (arg_values[i * 2]->type != VAL_STRING) {
+ if (arg_values[i * 2]->type != Value::Type::STRING) {
return ErrorAbort(state, kArgsParsingFailure, "%s(): sha-1 #%d is not string", name, i * 2);
}
- if (arg_values[i * 2 + 1]->type != VAL_BLOB) {
+ if (arg_values[i * 2 + 1]->type != Value::Type::BLOB) {
return ErrorAbort(state, kArgsParsingFailure, "%s(): patch #%d is not blob", name, i * 2 + 1);
}
}
@@ -741,8 +741,8 @@ Value* RunProgramFn(const char* name, State* state, const std::vector<std::uniqu
return StringValue(std::to_string(status));
}
-// Read a local file and return its contents (the Value* returned
-// is actually a FileContents*).
+// read_file(filename)
+// Reads a local file 'filename' and returns its contents as a Value string.
Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) {
if (argv.size() != 1) {
return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size());
@@ -750,18 +750,18 @@ Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_
std::vector<std::string> args;
if (!ReadArgs(state, argv, &args)) {
- return ErrorAbort(state, kArgsParsingFailure, "%s() Failed to parse the argument(s)", name);
+ return ErrorAbort(state, kArgsParsingFailure, "%s(): Failed to parse the argument(s)", name);
}
const std::string& filename = args[0];
- Value* v = new Value(VAL_INVALID, "");
-
FileContents fc;
if (LoadFileContents(filename.c_str(), &fc) == 0) {
- v->type = VAL_BLOB;
- v->data = std::string(fc.data.begin(), fc.data.end());
+ return new Value(Value::Type::BLOB, std::string(fc.data.cbegin(), fc.data.cend()));
}
- return v;
+
+ // Leave it to caller to handle the failure.
+ LOG(ERROR) << name << ": Failed to read " << filename;
+ return StringValue("");
}
// write_value(value, filename)