Ensure that String::setLen() is always after any memory operation
Since `String::setLen()` is now modifying the buffer, this change is required to ensure that the proper buffer is changed.
This commit is contained in:
parent
0e55f775d3
commit
dd834b3372
@ -159,7 +159,7 @@ unsigned char String::changeBuffer(unsigned int maxStrLen) {
|
|||||||
// Already using SSO, nothing to do
|
// Already using SSO, nothing to do
|
||||||
uint16_t oldLen = len();
|
uint16_t oldLen = len();
|
||||||
setSSO(true);
|
setSSO(true);
|
||||||
setLen(oldLen);
|
setLen(oldLen);
|
||||||
return 1;
|
return 1;
|
||||||
} else { // if bufptr && !isSSO()
|
} else { // if bufptr && !isSSO()
|
||||||
// Using bufptr, need to shrink into sso.buff
|
// Using bufptr, need to shrink into sso.buff
|
||||||
@ -168,8 +168,8 @@ unsigned char String::changeBuffer(unsigned int maxStrLen) {
|
|||||||
free(wbuffer());
|
free(wbuffer());
|
||||||
uint16_t oldLen = len();
|
uint16_t oldLen = len();
|
||||||
setSSO(true);
|
setSSO(true);
|
||||||
setLen(oldLen);
|
|
||||||
memcpy(wbuffer(), temp, maxStrLen);
|
memcpy(wbuffer(), temp, maxStrLen);
|
||||||
|
setLen(oldLen);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,8 +193,8 @@ unsigned char String::changeBuffer(unsigned int maxStrLen) {
|
|||||||
}
|
}
|
||||||
setSSO(false);
|
setSSO(false);
|
||||||
setCapacity(newSize - 1);
|
setCapacity(newSize - 1);
|
||||||
setLen(oldLen); // Needed in case of SSO where len() never existed
|
|
||||||
setBuffer(newbuffer);
|
setBuffer(newbuffer);
|
||||||
|
setLen(oldLen); // Needed in case of SSO where len() never existed
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -209,8 +209,8 @@ String & String::copy(const char *cstr, unsigned int length) {
|
|||||||
invalidate();
|
invalidate();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
setLen(length);
|
|
||||||
memmove(wbuffer(), cstr, length + 1);
|
memmove(wbuffer(), cstr, length + 1);
|
||||||
|
setLen(length);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,8 +219,8 @@ String & String::copy(const __FlashStringHelper *pstr, unsigned int length) {
|
|||||||
invalidate();
|
invalidate();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
setLen(length);
|
|
||||||
memcpy_P(wbuffer(), (PGM_P)pstr, length + 1); // We know wbuffer() cannot ever be in PROGMEM, so memcpy safe here
|
memcpy_P(wbuffer(), (PGM_P)pstr, length + 1); // We know wbuffer() cannot ever be in PROGMEM, so memcpy safe here
|
||||||
|
setLen(length);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,8 +250,8 @@ void String::move(String &rhs) {
|
|||||||
setLen(rhs.len());
|
setLen(rhs.len());
|
||||||
rhs.setSSO(false);
|
rhs.setSSO(false);
|
||||||
rhs.setCapacity(0);
|
rhs.setCapacity(0);
|
||||||
rhs.setLen(0);
|
|
||||||
rhs.setBuffer(nullptr);
|
rhs.setBuffer(nullptr);
|
||||||
|
rhs.setLen(0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -827,9 +827,9 @@ void String::trim(void) {
|
|||||||
while(isspace(*end) && end >= begin)
|
while(isspace(*end) && end >= begin)
|
||||||
end--;
|
end--;
|
||||||
unsigned int newlen = end + 1 - begin;
|
unsigned int newlen = end + 1 - begin;
|
||||||
setLen(newlen);
|
|
||||||
if(begin > buffer())
|
if(begin > buffer())
|
||||||
memmove(wbuffer(), begin, newlen);
|
memmove(wbuffer(), begin, newlen);
|
||||||
|
setLen(newlen);
|
||||||
wbuffer()[newlen] = 0;
|
wbuffer()[newlen] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user