fastboot: Fix flashing failure when a sparse image has an avb footer.

Trying to move the AVB footer on a sparse file will corrupt the sparse
format. Rather than implement this properly, for now, have the
copy_avb_footer() function gracefully fail by skipping the operation.

Bug: 304574023
Test: fastboot flash sparse image with avb footer
Change-Id: Ia6f0711789a04897ec266ad604a3d243c7184082
This commit is contained in:
David Anderson 2023-10-20 11:17:44 -07:00
parent 7bcd7715f8
commit 0bc02bfe71
2 changed files with 13 additions and 1 deletions

View file

@ -1053,8 +1053,10 @@ static bool load_buf_fd(unique_fd fd, struct fastboot_buffer* buf, const Flashin
return false;
}
sparse_file_destroy(s);
buf->file_type = FB_BUFFER_SPARSE;
} else {
buf->image_size = sz;
buf->file_type = FB_BUFFER_FD;
}
lseek(fd.get(), 0, SEEK_SET);
@ -1191,6 +1193,15 @@ static void copy_avb_footer(const ImageSource* source, const std::string& partit
should_flash_in_userspace(source, partition)) {
return;
}
// If the image is sparse, moving the footer will simply corrupt the sparse
// format, so currently we don't support moving the footer on sparse files.
if (buf->file_type == FB_BUFFER_SPARSE) {
LOG(ERROR) << "Warning: skip copying " << partition << " image avb footer due to sparse "
<< "image.";
return;
}
// If overflows and negative, it should be < buf->sz.
int64_t partition_size = static_cast<int64_t>(get_partition_size(partition));

View file

@ -57,7 +57,8 @@ enum fb_buffer_type {
};
struct fastboot_buffer {
enum fb_buffer_type type;
fb_buffer_type type;
fb_buffer_type file_type;
std::vector<SparsePtr> files;
int64_t sz;
unique_fd fd;