From 0bc02bfe71017757343657dff4f26b6c86ddb302 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 20 Oct 2023 11:17:44 -0700 Subject: [PATCH] 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 --- fastboot/fastboot.cpp | 11 +++++++++++ fastboot/fastboot.h | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 56b90b981..ac2a20f90 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -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(get_partition_size(partition)); diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index 2c40890b5..6a4997049 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -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 files; int64_t sz; unique_fd fd;