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:
parent
43bf393dbf
commit
bd57ff4ab4
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user