StreamString SSO fix (#2736)

As found by @mongozmaki in https://github.com/esp8266/Arduino/pull/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.
This commit is contained in:
Earle F. Philhower, III 2019-05-11 01:16:05 -07:00 committed by Me No Dev
parent 43bf393dbf
commit bd57ff4ab4

View File

@ -25,10 +25,11 @@
size_t StreamString::write(const uint8_t *data, size_t size) { size_t StreamString::write(const uint8_t *data, size_t size) {
if(size && data) { 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); memcpy((void *) (wbuffer() + len()), (const void *) data, size);
setLen(len() + size); setLen(newlen);
*(wbuffer() + len()) = 0x00; // add null for string end *(wbuffer() + newlen) = 0x00; // add null for string end
return size; return size;
} }
} }