mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
app_update: fix incorrect first byte from esp_ota_get_app_elf_sha256
At -O2 optimization level, GCC seems to optimize out the copying of the first byte of the checksum, assuming it is zero. This "miscompilation" happens because the esp_app_desc struct is declared const, but then modified post-compilation. Casting to volatile disables the optimization. Closes: https://github.com/espressif/esp-idf/pull/6389
This commit is contained in:
parent
3729a33c90
commit
563bc5d19d
@ -89,7 +89,10 @@ int IRAM_ATTR esp_ota_get_app_elf_sha256(char* dst, size_t size)
|
|||||||
static bool first_call = true;
|
static bool first_call = true;
|
||||||
if (first_call) {
|
if (first_call) {
|
||||||
first_call = false;
|
first_call = false;
|
||||||
const uint8_t* src = esp_app_desc.app_elf_sha256;
|
// At -O2 optimization level, GCC optimizes out the copying of the first byte of the app_elf_sha256,
|
||||||
|
// because it is zero at compile time, and only modified afterwards by esptool.
|
||||||
|
// Casting to volatile disables the optimization.
|
||||||
|
const volatile uint8_t* src = (const volatile uint8_t*)esp_app_desc.app_elf_sha256;
|
||||||
for (size_t i = 0; i < sizeof(s_app_elf_sha256); ++i) {
|
for (size_t i = 0; i < sizeof(s_app_elf_sha256); ++i) {
|
||||||
s_app_elf_sha256[i] = src[i];
|
s_app_elf_sha256[i] = src[i];
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user