fastboot: Don't fail when unable to get boot partition size
* Some devices don't report boot partition size Change-Id: If83f785e235569ee8ef0de2b37f11dbd2a9a71f4
This commit is contained in:
parent
f4a40c0edd
commit
a495be742c
1 changed files with 20 additions and 15 deletions
|
@ -1005,6 +1005,11 @@ static bool has_vbmeta_partition() {
|
|||
fb->GetVar("partition-type:vbmeta_b", &partition_type) == fastboot::SUCCESS;
|
||||
}
|
||||
|
||||
static bool is_logical(const std::string& partition) {
|
||||
std::string value;
|
||||
return fb->GetVar("is-logical:" + partition, &value) == fastboot::SUCCESS && value == "yes";
|
||||
}
|
||||
|
||||
static std::string fb_fix_numeric_var(std::string var) {
|
||||
// Some bootloaders (angler, for example), send spurious leading whitespace.
|
||||
var = android::base::Trim(var);
|
||||
|
@ -1017,12 +1022,18 @@ static std::string fb_fix_numeric_var(std::string var) {
|
|||
static uint64_t get_partition_size(const std::string& partition) {
|
||||
std::string partition_size_str;
|
||||
if (fb->GetVar("partition-size:" + partition, &partition_size_str) != fastboot::SUCCESS) {
|
||||
if (!is_logical(partition)) {
|
||||
return 0;
|
||||
}
|
||||
die("cannot get partition size for %s", partition.c_str());
|
||||
}
|
||||
|
||||
partition_size_str = fb_fix_numeric_var(partition_size_str);
|
||||
uint64_t partition_size;
|
||||
if (!android::base::ParseUint(partition_size_str, &partition_size)) {
|
||||
if (!is_logical(partition)) {
|
||||
return 0;
|
||||
}
|
||||
die("Couldn't parse partition size '%s'.", partition_size_str.c_str());
|
||||
}
|
||||
return partition_size;
|
||||
|
@ -1033,16 +1044,6 @@ static void copy_boot_avb_footer(const std::string& partition, struct fastboot_b
|
|||
return;
|
||||
}
|
||||
|
||||
// If overflows and negative, it should be < buf->sz.
|
||||
int64_t partition_size = static_cast<int64_t>(get_partition_size(partition));
|
||||
|
||||
if (partition_size == buf->sz) {
|
||||
return;
|
||||
}
|
||||
if (partition_size < buf->sz) {
|
||||
die("boot partition is smaller than boot image");
|
||||
}
|
||||
|
||||
std::string data;
|
||||
if (!android::base::ReadFdToString(buf->fd, &data)) {
|
||||
die("Failed reading from boot");
|
||||
|
@ -1052,6 +1053,15 @@ static void copy_boot_avb_footer(const std::string& partition, struct fastboot_b
|
|||
if (0 != data.compare(footer_offset, AVB_FOOTER_MAGIC_LEN, AVB_FOOTER_MAGIC)) {
|
||||
return;
|
||||
}
|
||||
// If overflows and negative, it should be < buf->sz.
|
||||
int64_t partition_size = static_cast<int64_t>(get_partition_size(partition));
|
||||
|
||||
if (partition_size == buf->sz) {
|
||||
return;
|
||||
}
|
||||
if (partition_size < buf->sz) {
|
||||
die("boot partition is smaller than boot image");
|
||||
}
|
||||
|
||||
unique_fd fd(make_temporary_fd("boot rewriting"));
|
||||
if (!android::base::WriteStringToFd(data, fd)) {
|
||||
|
@ -1248,11 +1258,6 @@ static void do_for_partitions(const std::string& part, const std::string& slot,
|
|||
}
|
||||
}
|
||||
|
||||
static bool is_logical(const std::string& partition) {
|
||||
std::string value;
|
||||
return fb->GetVar("is-logical:" + partition, &value) == fastboot::SUCCESS && value == "yes";
|
||||
}
|
||||
|
||||
static bool is_retrofit_device() {
|
||||
std::string value;
|
||||
if (fb->GetVar("super-partition-name", &value) != fastboot::SUCCESS) {
|
||||
|
|
Loading…
Reference in a new issue