From e38b292c22b05d802d2766fd9f1beba354c44811 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 31 Dec 2017 04:04:21 +0100 Subject: [PATCH 1/3] ota: fix potential network error by checking return values --- cores/esp8266/Updater.h | 42 ++++++++++------------------- libraries/ArduinoOTA/ArduinoOTA.cpp | 9 ++++--- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index 2509988ca8..5f031f3d77 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -107,38 +107,24 @@ class UpdaterClass { */ template size_t write(T &data){ - size_t written = 0; if (hasError() || !isRunning()) return 0; - size_t available = data.available(); - while(available) { - if(_bufferLen + available > remaining()){ - available = remaining() - _bufferLen; - } - if(_bufferLen + available > _bufferSize) { - size_t toBuff = _bufferSize - _bufferLen; - data.read(_buffer + _bufferLen, toBuff); - _bufferLen += toBuff; - if(!_writeBuffer()) - return written; - written += toBuff; - } else { - data.read(_buffer + _bufferLen, available); - _bufferLen += available; - written += available; - if(_bufferLen == remaining()) { - if(!_writeBuffer()) { - return written; - } - } - } - if(remaining() == 0) - return written; - delay(1); - available = data.available(); + // load exactly one _bufSize before flashing it + // (the last one may be smaller) + size_t wantedBufSize = remaining() < _bufferSize? + remaining(): + _bufferSize; + size_t readThisTime = 0; + + while (data.available() && _bufferLen < wantedBufSize) { + size_t got = data.read(_buffer + _bufferLen, wantedBufSize - _bufferLen); + _bufferLen += got; + readThisTime += got; } - return written; + if (_bufferLen == wantedBufSize && !_writeBuffer()) + return 0; + return readThisTime; } private: diff --git a/libraries/ArduinoOTA/ArduinoOTA.cpp b/libraries/ArduinoOTA/ArduinoOTA.cpp index 24be99d374..97b1978576 100644 --- a/libraries/ArduinoOTA/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/ArduinoOTA.cpp @@ -292,11 +292,11 @@ void ArduinoOTAClass::_runUpdate() { } uint32_t written, total = 0; - while (!Update.isFinished() && client.connected()) { - int waited = 1000; - while (!client.available() && waited--) + while (!Update.isFinished()) { + int wait = 1000; + while (!client.available() && --wait) delay(1); - if (!waited){ + if (!client.available()){ #ifdef OTA_DEBUG OTA_DEBUG.printf("Receive Failed\n"); #endif @@ -305,6 +305,7 @@ void ArduinoOTAClass::_runUpdate() { _error_callback(OTA_RECEIVE_ERROR); } _state = OTA_IDLE; + break; } written = Update.write(client); if (written > 0) { From b5f471444a918ef10f622fa6e33002324728d22b Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 2 Aug 2020 22:38:29 +0200 Subject: [PATCH 2/3] simplify test --- cores/esp8266/Updater.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index d5c07ff96b..e3ee6584b0 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -144,9 +144,7 @@ class UpdaterClass { // load exactly one _bufSize before flashing it // (the last one may be smaller) - size_t wantedBufSize = remaining() < _bufferSize? - remaining(): - _bufferSize; + size_t wantedBufSize = std::min(remaining(), _bufferSize); size_t readThisTime = 0; while (data.available() && _bufferLen < wantedBufSize) { From c33566cc382387ea7db36061ec6d3a1c40cb91e3 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 2 Aug 2020 22:38:44 +0200 Subject: [PATCH 3/3] sanity check --- cores/esp8266/Updater.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index e3ee6584b0..c5eddf7f2c 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -149,6 +149,8 @@ class UpdaterClass { while (data.available() && _bufferLen < wantedBufSize) { size_t got = data.read(_buffer + _bufferLen, wantedBufSize - _bufferLen); + if (!got) + break; _bufferLen += got; readThisTime += got; }