Skip to content

Commit

Permalink
fastboot: Fix hang when sparse images end in small chunks.
Browse files Browse the repository at this point in the history
When host fastboot sends sparse blocks to the device, it tries to only
send blocks in multiples of 1024 bytes. If a block is not aligned to this
size, the excess bytes are prepended to the next write operation. This
is implemented by doing the write in two steps: first the previous
excess from the last write (plus new data up to alignment), then a
second write for the aligned remainder of the new data.

This logic has a bug if the final block plus the previous excess data
contains >= 1024 but < 2048 bytes. In this case the first write will
drain 1024 bytes from the data, and the second write will not have 1024
bytes to write. Instead of retaining this data for the next write, it
tries to write 0 chunks (and thus 0 bytes), which hangs the ioctl() call.

Bug: N/A
Test: "fastboot flash super super.img" where super.img is generated by
      lpmake, containing system and product_services partitions and
      images.

Change-Id: I9e8523c976ec84d5a57b36a28f4b1ca800edb7e7
  • Loading branch information
dvandercorp committed Jul 30, 2018
1 parent d5f825c commit 0c7bde8
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions fastboot/fastboot_driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,10 @@ RetCode FastBootDriver::SendBuffer(const std::vector<char>& buf) {
}

RetCode FastBootDriver::SendBuffer(const void* buf, size_t size) {
if (!size) {
return SUCCESS;
}

// Write the buffer
ssize_t tmp = transport->Write(buf, size);

Expand Down

0 comments on commit 0c7bde8

Please sign in to comment.