From 335a6f7f81aa64fe05c799f3a331fb3c9229c61f Mon Sep 17 00:00:00 2001 From: MathewHDYT <48954742+MathewHDYT@users.noreply.github.com> Date: Mon, 25 Sep 2023 20:22:03 +0200 Subject: [PATCH 1/3] Fix memory leak and undefined behavour in Updater #7984 --- libraries/Update/src/Updater.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libraries/Update/src/Updater.cpp b/libraries/Update/src/Updater.cpp index c461e7377e7..7ea6c4423af 100644 --- a/libraries/Update/src/Updater.cpp +++ b/libraries/Update/src/Updater.cpp @@ -76,9 +76,15 @@ UpdateClass& UpdateClass::onProgress(THandlerFunction_Progress fn) { } void UpdateClass::_reset() { - if (_buffer) + if (_buffer) { delete[] _buffer; - _buffer = 0; + } + if (_skipBuffer) { + delete[] _skipBuffer; + } + + _buffer = nullptr; + _skipBuffer = nullptr; _bufferLen = 0; _progress = 0; _size = 0; @@ -159,8 +165,8 @@ bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, con } //initialize - _buffer = (uint8_t*)malloc(SPI_FLASH_SEC_SIZE); - if(!_buffer){ + _buffer = new (std::nothrow) uint8_t[SPI_FLASH_SEC_SIZE]; + if (!_buffer) { log_e("malloc failed"); return false; } @@ -193,10 +199,10 @@ bool UpdateClass::_writeBuffer(){ //not written at this point so that partially written firmware //will not be bootable skip = ENCRYPTED_BLOCK_SIZE; - _skipBuffer = (uint8_t*)malloc(skip); - if(!_skipBuffer){ + _skipBuffer = new (std::nothrow) uint8_t[skip]; + if (!_skipBuffer) { log_e("malloc failed"); - return false; + return false; } memcpy(_skipBuffer, _buffer, skip); } From 14e7e6ecc71d63485830bafe9603614637784f8b Mon Sep 17 00:00:00 2001 From: MathewHDYT <48954742+MathewHDYT@users.noreply.github.com> Date: Wed, 4 Oct 2023 12:38:30 +0200 Subject: [PATCH 2/3] Update error message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> --- libraries/Update/src/Updater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Update/src/Updater.cpp b/libraries/Update/src/Updater.cpp index 7ea6c4423af..38e3c8641a0 100644 --- a/libraries/Update/src/Updater.cpp +++ b/libraries/Update/src/Updater.cpp @@ -167,7 +167,7 @@ bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, con //initialize _buffer = new (std::nothrow) uint8_t[SPI_FLASH_SEC_SIZE]; if (!_buffer) { - log_e("malloc failed"); + log_e("_buffer allocation failed"); return false; } _size = size; From 6e65d231fc36062960d8b4ba692203d668b21d17 Mon Sep 17 00:00:00 2001 From: MathewHDYT <48954742+MathewHDYT@users.noreply.github.com> Date: Wed, 4 Oct 2023 12:38:39 +0200 Subject: [PATCH 3/3] Update error message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com> --- libraries/Update/src/Updater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Update/src/Updater.cpp b/libraries/Update/src/Updater.cpp index 38e3c8641a0..a0cd0899473 100644 --- a/libraries/Update/src/Updater.cpp +++ b/libraries/Update/src/Updater.cpp @@ -201,7 +201,7 @@ bool UpdateClass::_writeBuffer(){ skip = ENCRYPTED_BLOCK_SIZE; _skipBuffer = new (std::nothrow) uint8_t[skip]; if (!_skipBuffer) { - log_e("malloc failed"); + log_e("_skipBuffer allocation failed"); return false; } memcpy(_skipBuffer, _buffer, skip);