fix: SHA256-Kontext pro Image initialisieren statt einmal beim Task-Start

Der fwup-Task überlebt jede Update-Sitzung. Weil nl_sha256_init() am
Taskanfang stand, benutzte ab dem zweiten Update-Versuch pro Boot ein
bereits finalisierter Kontext weiter - der Trailer-Hash konnte dann gar
nicht mehr passen und jedes weitere Update scheiterte mit
last_ota_error=hash. Am EVK gefunden: nach einer Ablehnung war ein
Reboot nötig, bevor überhaupt wieder ein Update gelingen konnte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Michael Sauer
2026-09-12 10:38:01 +02:00
co-authored by Claude Opus 5
parent 6588085679
commit d56f1d25d2
2 changed files with 1043 additions and 1032 deletions
+7
View File
@@ -70,6 +70,13 @@ Lib/GNU, Bin/secboot.img, Tools/GNU/link_w600_2m.ld (→ ld/) und wm_tool.c (→
exportierte) `session_id`, wäre also ein größerer Eingriff für denselben Effekt. Nebenbei:
`nRetCode = ret` (ein lwIP-`err_t` in einer sonst `HTTP_CLIENT_*`-Codes tragenden Variable) durch
`HTTP_CLIENT_ERROR_BAD_STATE` ersetzt.
**Fix vom 2026-09-12 (am EVK gefunden):** `nl_sha256_init()` stand am Anfang von `fwup_scheduler()`,
also einmal beim Task-Start. Der Task überlebt aber jede Update-Sitzung, sodass ab dem zweiten Versuch
pro Boot ein bereits finalisierter Kontext weiterbenutzt wurde und der Trailer-Hash zwangsläufig nicht
mehr passte (`last_ota_error=hash`). Der Init sitzt jetzt dort, wo der `T_BOOTER`-Header eintrifft, also
genau einmal pro Image. Ohne diesen Fix war nach jeder Ablehnung ein Reboot nötig, bevor ein Update
überhaupt wieder gelingen konnte.
2. `Src/OS/RTOS/include/FreeRTOSConfig.h`: `configGENERATE_RUN_TIME_STATS 0`, QConnex-Debug-Hooks entfernt.
3. `undefined reference` beim Linken auf `EarlyInit` und `pre_gpio_config` (von
`sdk/Platform/Sys/wm_main.c` als `extern`-Hooks erwartet, aber nur von der App bereitgestellt):
+5 -1
View File
@@ -190,8 +190,11 @@ static void fwup_scheduler(void *data)
u32 tmplen = 0;
bool isacrossflash = FALSE;
/* ninlight: the context is (re)initialised per image, where the T_BOOTER header arrives -
* NOT here. This task outlives every update session, so initialising once at task start
* left a finalised context behind after the first attempt and every later update in the
* same boot failed with last_ota_error=hash. Found on the EVK, 2026-09-12. */
nl_sha256_ctx sha;
nl_sha256_init(&sha);
u8 image_sha256[32] = {0};
u8 *RSA_SHA256 = NULL;
@@ -264,6 +267,7 @@ static void fwup_scheduler(void *data)
fwup->current_state |= TLS_FWUP_STATE_ERROR_IO;
goto request_finish;
}
nl_sha256_init(&sha); /* fresh context for this image */
nl_sha256_update(&sha, (u8*)&booter, sizeof(T_BOOTER));
if ((IMG_TYPE_OLD_PLAIN == booter.img_type ) ||(IMG_TYPE_NEW_PLAIN == booter.img_type))