Skip to content

Commit 8dd068e

Browse files
Add memmove_P, use it in String to ensure F() safety (#6514)
memmove_P is now in libc, so use it to allow WString to handle F() pointers without errors. Supercedes #6368 Fixes #6384
1 parent 990ec75 commit 8dd068e

File tree

4 files changed

+16
-19
lines changed

4 files changed

+16
-19
lines changed

cores/esp8266/WString.cpp

+14-19
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ unsigned char String::changeBuffer(unsigned int maxStrLen) {
185185
size_t oldSize = capacity() + 1; // include NULL.
186186
if (isSSO()) {
187187
// Copy the SSO buffer into allocated space
188-
memmove(newbuffer, sso.buff, sizeof(sso.buff));
188+
memmove_P(newbuffer, sso.buff, sizeof(sso.buff));
189189
}
190190
if (newSize > oldSize)
191191
{
@@ -210,7 +210,7 @@ String & String::copy(const char *cstr, unsigned int length) {
210210
return *this;
211211
}
212212
setLen(length);
213-
memmove(wbuffer(), cstr, length + 1);
213+
memmove_P(wbuffer(), cstr, length + 1);
214214
return *this;
215215
}
216216

@@ -228,7 +228,7 @@ String & String::copy(const __FlashStringHelper *pstr, unsigned int length) {
228228
void String::move(String &rhs) {
229229
if(buffer()) {
230230
if(capacity() >= rhs.len()) {
231-
memmove(wbuffer(), rhs.buffer(), rhs.length() + 1);
231+
memmove_P(wbuffer(), rhs.buffer(), rhs.length() + 1);
232232
setLen(rhs.len());
233233
rhs.invalidate();
234234
return;
@@ -241,7 +241,7 @@ void String::move(String &rhs) {
241241
}
242242
if (rhs.isSSO()) {
243243
setSSO(true);
244-
memmove(sso.buff, rhs.sso.buff, sizeof(sso.buff));
244+
memmove_P(sso.buff, rhs.sso.buff, sizeof(sso.buff));
245245
} else {
246246
setSSO(false);
247247
setBuffer(rhs.wbuffer());
@@ -313,7 +313,7 @@ unsigned char String::concat(const String &s) {
313313
return 1;
314314
if (!reserve(newlen))
315315
return 0;
316-
memmove(wbuffer() + len(), buffer(), len());
316+
memmove_P(wbuffer() + len(), buffer(), len());
317317
setLen(newlen);
318318
wbuffer()[len()] = 0;
319319
return 1;
@@ -330,12 +330,7 @@ unsigned char String::concat(const char *cstr, unsigned int length) {
330330
return 1;
331331
if(!reserve(newlen))
332332
return 0;
333-
if (cstr >= wbuffer() && cstr < wbuffer() + len())
334-
// compatible with SSO in ram #6155 (case "x += x.c_str()")
335-
memmove(wbuffer() + len(), cstr, length + 1);
336-
else
337-
// compatible with source in flash #6367
338-
memcpy_P(wbuffer() + len(), cstr, length + 1);
333+
memmove_P(wbuffer() + len(), cstr, length + 1);
339334
setLen(newlen);
340335
return 1;
341336
}
@@ -739,21 +734,21 @@ void String::replace(const String& find, const String& replace) {
739734
char *foundAt;
740735
if(diff == 0) {
741736
while((foundAt = strstr(readFrom, find.buffer())) != NULL) {
742-
memmove(foundAt, replace.buffer(), replace.len());
737+
memmove_P(foundAt, replace.buffer(), replace.len());
743738
readFrom = foundAt + replace.len();
744739
}
745740
} else if(diff < 0) {
746741
char *writeTo = wbuffer();
747742
while((foundAt = strstr(readFrom, find.buffer())) != NULL) {
748743
unsigned int n = foundAt - readFrom;
749-
memmove(writeTo, readFrom, n);
744+
memmove_P(writeTo, readFrom, n);
750745
writeTo += n;
751-
memmove(writeTo, replace.buffer(), replace.len());
746+
memmove_P(writeTo, replace.buffer(), replace.len());
752747
writeTo += replace.len();
753748
readFrom = foundAt + find.len();
754749
setLen(len() + diff);
755750
}
756-
memmove(writeTo, readFrom, strlen(readFrom)+1);
751+
memmove_P(writeTo, readFrom, strlen(readFrom)+1);
757752
} else {
758753
unsigned int size = len(); // compute size needed for result
759754
while((foundAt = strstr(readFrom, find.buffer())) != NULL) {
@@ -767,9 +762,9 @@ void String::replace(const String& find, const String& replace) {
767762
int index = len() - 1;
768763
while(index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
769764
readFrom = wbuffer() + index + find.len();
770-
memmove(readFrom + diff, readFrom, len() - (readFrom - buffer()));
765+
memmove_P(readFrom + diff, readFrom, len() - (readFrom - buffer()));
771766
int newLen = len() + diff;
772-
memmove(wbuffer() + index, replace.buffer(), replace.len());
767+
memmove_P(wbuffer() + index, replace.buffer(), replace.len());
773768
setLen(newLen);
774769
wbuffer()[newLen] = 0;
775770
index--;
@@ -797,7 +792,7 @@ void String::remove(unsigned int index, unsigned int count) {
797792
char *writeTo = wbuffer() + index;
798793
unsigned int newlen = len() - count;
799794
setLen(newlen);
800-
memmove(writeTo, wbuffer() + index + count, newlen - index);
795+
memmove_P(writeTo, wbuffer() + index + count, newlen - index);
801796
wbuffer()[newlen] = 0;
802797
}
803798

@@ -829,7 +824,7 @@ void String::trim(void) {
829824
unsigned int newlen = end + 1 - begin;
830825
setLen(newlen);
831826
if(begin > buffer())
832-
memmove(wbuffer(), begin, newlen);
827+
memmove_P(wbuffer(), begin, newlen);
833828
wbuffer()[newlen] = 0;
834829
}
835830

tests/host/sys/pgmspace.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ inline size_t strlen_P(const char *s) { return strlen(s); }
6060
inline int vsnprintf_P(char *str, size_t size, const char *format, va_list ap) { return vsnprintf(str, size, format, ap); }
6161

6262
#define memcpy_P memcpy
63+
#define memmove_P memmove
6364
#define strncpy_P strncpy
6465
#define strcmp_P strcmp
6566
#define memccpy_P memccpy

tools/sdk/libc/xtensa-lx106-elf/include/sys/string.h

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ extern "C" {
2525
int _EXFUN(memcmp_P,(const _PTR, const _PTR, size_t));
2626
_PTR _EXFUN(memmem_P, (const _PTR, size_t, const _PTR, size_t));
2727
_PTR _EXFUN(memcpy_P,(_PTR __restrict, const _PTR __restrict, size_t));
28+
_PTR _EXFUN(memmove_P,(_PTR __restrict, const _PTR __restrict, size_t));
2829
_PTR _EXFUN(memccpy_P,(_PTR __restrict, const _PTR __restrict, int, size_t));
2930
_PTR _EXFUN(memchr_P,(const _PTR, int, size_t));
3031

1.24 KB
Binary file not shown.

0 commit comments

Comments
 (0)