From 4decd52e52024eccd50fc0e6f965a5b348dc8a7b Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Mon, 15 Sep 2025 11:53:37 +0530 Subject: [PATCH] fix: add check to ensure OTA buffer size for 16-byte aligned This commit added guide to, round off OTA written size to allowed aignmnet when flash ecnryption enabled. --- components/app_update/include/esp_ota_ops.h | 4 ++++ components/esp_https_ota/src/esp_https_ota.c | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/components/app_update/include/esp_ota_ops.h b/components/app_update/include/esp_ota_ops.h index 8ae4cdd315..1a92da1f1e 100644 --- a/components/app_update/include/esp_ota_ops.h +++ b/components/app_update/include/esp_ota_ops.h @@ -113,6 +113,10 @@ esp_err_t esp_ota_begin(const esp_partition_t* partition, size_t image_size, esp * Unlike esp_ota_begin(), this function does not erase the partition which receives the OTA update, but rather expects that part of the image * has already been written correctly, and it resumes writing from the given offset. * + * @note When flash encryption is enabled, data writes must be 16-byte aligned. + * Any leftover (non-aligned) data is temporarily cached and may be lost after reboot. + * Therefore, during resumption, ensure that image offset is always 16-byte aligned. + * * @param partition Pointer to info for the partition which is receiving the OTA update. Required. * @param erase_size Specifies how much flash memory to erase before resuming OTA, depending on whether a sequential write or a bulk erase is being used. * @param image_offset Offset from where to resume the OTA process. Should be set to the number of bytes already written. diff --git a/components/esp_https_ota/src/esp_https_ota.c b/components/esp_https_ota/src/esp_https_ota.c index dd8855a7c7..dacc93d06a 100644 --- a/components/esp_https_ota/src/esp_https_ota.c +++ b/components/esp_https_ota/src/esp_https_ota.c @@ -14,6 +14,7 @@ #include #include #include "esp_check.h" +#include "esp_flash_encrypt.h" #include "hal/efuse_hal.h" ESP_EVENT_DEFINE_BASE(ESP_HTTPS_OTA_EVENT); @@ -483,6 +484,14 @@ esp_err_t esp_https_ota_begin(const esp_https_ota_config_t *ota_config, esp_http } const int alloc_size = MAX(ota_config->http_config->buffer_size, DEFAULT_OTA_BUF_SIZE); + if (ota_config->ota_resumption) { + if (esp_flash_encryption_enabled() && (alloc_size & 0xFU) != 0) { + // For FE case the flash is written in multiples of 16 bytes + ESP_LOGE(TAG, "Buffer size must be multiple of 16 bytes for FE and ota resumption case"); + goto http_cleanup; + } + } + if (ota_config->buffer_caps != 0) { https_ota_handle->ota_upgrade_buf = (char *)heap_caps_malloc(alloc_size, ota_config->buffer_caps); } else {