diff --git a/cores/esp32/WString.cpp b/cores/esp32/WString.cpp index aee4b1c9..f73cbe58 100644 --- a/cores/esp32/WString.cpp +++ b/cores/esp32/WString.cpp @@ -130,9 +130,9 @@ String::~String() { inline void String::init(void) { setSSO(false); + setBuffer(nullptr); setCapacity(0); setLen(0); - setBuffer(nullptr); } void String::invalidate(void) { diff --git a/cores/esp32/WString.h b/cores/esp32/WString.h index 9111d9aa..ae039869 100644 --- a/cores/esp32/WString.h +++ b/cores/esp32/WString.h @@ -301,9 +301,19 @@ class String { inline unsigned int len() const { return isSSO() ? sso.len : ptr.len; } inline unsigned int capacity() const { return isSSO() ? (unsigned int)SSOSIZE - 1 : ptr.cap; } // Size of max string not including terminal NUL inline void setSSO(bool set) { sso.isSSO = set; } - inline void setLen(int len) { if (isSSO()) sso.len = len; else ptr.len = len; } + inline void setLen(int len) { + if (isSSO()) { + sso.len = len; + sso.buff[len] = 0; + } else { + ptr.len = len; + if (ptr.buff) { + ptr.buff[len] = 0; + } + } + } inline void setCapacity(int cap) { if (!isSSO()) ptr.cap = cap; } - inline void setBuffer(char *buff) { if (!isSSO()) ptr.buff = buff; } + inline void setBuffer(char *buff) { if (!isSSO()) ptr.buff = buff; } // Buffer accessor functions inline const char *buffer() const { return (const char *)(isSSO() ? sso.buff : ptr.buff); } inline char *wbuffer() const { return isSSO() ? const_cast(sso.buff) : ptr.buff; } // Writable version of buffer