From a994b75d7533eedfafeb44c7b7cb7f11b9683eab Mon Sep 17 00:00:00 2001 From: Harald Date: Thu, 2 May 2019 18:55:43 +0200 Subject: [PATCH] StreamString SSO bug (#6035) With SSO implementation in String, StreamString::write generates wrong strings under some circumstances. Reason is that String::len() returns strlen(sso_buf) if SSO=true but with newly written data (in StreamString::write) the null-termination missing at the time len() is called. Furthermore, len() is called twice which is inefficient if SSO=true. * Git ignore * - StreamString fix * Remove changes to gitignore * Fix missing space for 0-terminator lost in conversion --- cores/esp8266/StreamString.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/StreamString.cpp b/cores/esp8266/StreamString.cpp index bb9923223..f50b6825b 100644 --- a/cores/esp8266/StreamString.cpp +++ b/cores/esp8266/StreamString.cpp @@ -25,10 +25,11 @@ size_t StreamString::write(const uint8_t *data, size_t size) { if(size && data) { - if(reserve(length() + size + 1)) { + const unsigned int newlen = length() + size; + if(reserve(newlen + 1)) { memcpy((void *) (wbuffer() + len()), (const void *) data, size); - setLen(len() + size); - *(wbuffer() + len()) = 0x00; // add null for string end + setLen(newlen); + *(wbuffer() + newlen) = 0x00; // add null for string end return size; } }