fix: abgewiesener fw_update verdirbt last_ota_error des laufenden Updates nicht mehr

Ein zweiter fw_update waehrend eines laufenden Downloads setzte s_error
auf "busy". Da ota_task() nur bei leerem Fehlerfeld auf "download"
zurueckfaellt, wurde ein spaeter gescheiterter Transfer danach als
"busy" gemeldet statt als "download". Die Abweisung hat kein eigenes
Ergebnis - sie wird der API mit 409 gemeldet, last_ota_error bleibt beim
Ergebnis des laufenden bzw. letzten Updates.

Dazu die Doku auf das am EVK gemessene Verhalten korrigiert: stirbt die
Gegenstelle mitten im Download, haengt der Lesevorgang rund sieben
Minuten in einem TCP-Timeout und bricht ohne Range-Resume ab.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Michael Sauer
2026-09-12 10:58:09 +02:00
co-authored by Claude Opus 5
parent 6adf22fb52
commit 5e2dff375e
5 changed files with 23 additions and 12 deletions
+6 -1
View File
@@ -115,7 +115,12 @@ static int ota_start(const char *url, bool reject_running_version)
if (n <= 7 || n >= sizeof s_url) /* n == 7 is bare "http://" with no host */
return -1;
if (s_busy) {
s_error = "busy";
/* Do NOT touch s_error here. last_ota_error describes the outcome of the *running or last*
* update; a request we reject because one is already in flight has no outcome of its own.
* Writing "busy" into it used to poison the running attempt's slot: ota_task() only falls
* back to "download" when s_error is still NULL, so a failed transfer was afterwards
* reported as `busy` instead of `download`. Found on the EVK, 2026-09-12. The REST layer
* reports the rejection to its own caller with 409. */
return -1;
}
s_busy = true;