summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Watt <jpewhacker@gmail.com>2024-08-28 08:37:57 -0600
committerMattijs Korpershoek <mkorpershoek@baylibre.com>2024-09-05 08:55:04 +0200
commitcc2f60c13f6aaf1bd277cf10c8b375c2e4a695b7 (patch)
tree03909474db52042b7745961c51bb3743fd439bd6
parent1312faac5f52d27cfb45dfe1a5a93a2944ca5c21 (diff)
android_ab: Fixes: Fix backup offset calculation
The backup offset is in bytes, but was incorrectly be interpreted as blocks, leading to it being written to the wrong location. Fix the calculation, clarify that ANDROID_AB_BACKUP_OFFSET is in bytes and must be a multiple of the block size, and add a runtime check to validate the offset. Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> Fixes: 3430f24bc69d ("android_ab: Try backup booloader_message") Link: https://lore.kernel.org/r/20240828143924.3987331-1-JPEWhacker@gmail.com Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
-rw-r--r--boot/android_ab.c9
-rw-r--r--common/Kconfig3
2 files changed, 9 insertions, 3 deletions
diff --git a/boot/android_ab.c b/boot/android_ab.c
index 143f373aae9..1196a189ed5 100644
--- a/boot/android_ab.c
+++ b/boot/android_ab.c
@@ -139,8 +139,13 @@ static int ab_control_store(struct blk_desc *dev_desc,
{
ulong abc_offset, abc_blocks, ret;
- abc_offset = offset +
- offsetof(struct bootloader_message_ab, slot_suffix) /
+ if (offset % part_info->blksz) {
+ log_err("ANDROID: offset not block aligned\n");
+ return -EINVAL;
+ }
+
+ abc_offset = (offset +
+ offsetof(struct bootloader_message_ab, slot_suffix)) /
part_info->blksz;
abc_blocks = DIV_ROUND_UP(sizeof(struct bootloader_control),
part_info->blksz);
diff --git a/common/Kconfig b/common/Kconfig
index 83c81edac20..e1b8557e0cb 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -986,7 +986,8 @@ config ANDROID_AB_BACKUP_OFFSET
help
If non-zero, a backup bootloader message starting at this offset in
the partition will tried in the event that the primary one (starting
- at offset 0) fails its checksum.
+ at offset 0) fails its checksum. The offset is in bytes and must be
+ multiple of the block size.
endmenu