android: boot: fix wrong end of header in v3/v4 parsing
authorGuillaume Ranquet <ranquet.guillaume@gmail.com>
Thu, 11 Sep 2025 13:50:26 +0000 (15:50 +0200)
committerTom Rini <trini@konsulko.com>
Wed, 24 Sep 2025 17:03:16 +0000 (11:03 -0600)
The android boot header is page aligned but the current code made the
assumption that the header was always smaller than the current header
format.

When the page_size is defined as 2048, as this is the case with the
cuttlefish target, the current code sets the end of the header in the
middle of it as the v3 and v4 headers are respectively 2112 and 2128
bytes long.

Fix that by aligning to page_size

Fixes: 1115027d2f75 ("android: boot: update android_image_get_data to support v3, v4")
Signed-off-by: Guillaume Ranquet <ranquet.guillaume@gmail.com>
boot/image-android.c
include/android_image.h

index 1cd2060..e46dee0 100644 (file)
@@ -107,7 +107,12 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const struct andr_vnd_boot
        data->dtb_load_addr = hdr->dtb_addr;
        data->bootconfig_size = hdr->bootconfig_size;
        end = (ulong)hdr;
-       end += hdr->page_size;
+
+       if (hdr->header_version > 3)
+               end += ALIGN(ANDR_VENDOR_BOOT_V4_SIZE, hdr->page_size);
+       else
+               end += ALIGN(ANDR_VENDOR_BOOT_V3_SIZE, hdr->page_size);
+
        if (hdr->vendor_ramdisk_size) {
                data->vendor_ramdisk_ptr = end;
                data->vendor_ramdisk_size = hdr->vendor_ramdisk_size;
index 9682070..a2d8049 100644 (file)
@@ -21,6 +21,8 @@
 #define ANDR_BOOT_ARGS_SIZE 512
 #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
 #define VENDOR_BOOT_MAGIC "VNDRBOOT"
+#define ANDR_VENDOR_BOOT_V3_SIZE 2112 /* sz(andr_vnd_boot_img_hdr) - sz(vendor_ramdisk_table*) */
+#define ANDR_VENDOR_BOOT_V4_SIZE 2128 /* sz(andr_vnd_boot_img_hdr) */
 #define ANDR_VENDOR_BOOT_MAGIC_SIZE 8
 #define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
 #define ANDR_VENDOR_BOOT_NAME_SIZE 16