Skip to content

Commit 0fa25c0

Browse files
committed
Fix possible leak in String
Fixes: espressif#710
1 parent f1e87d9 commit 0fa25c0

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

cores/esp32/WString.cpp

+13-8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include "WString.h"
2525
#include "stdlib_noniso.h"
26+
#include "esp32-hal-log.h"
2627
//extern "C" {
2728
//#include "esp_common.h"
2829
//}
@@ -165,19 +166,23 @@ unsigned char String::reserve(unsigned int size)
165166

166167
unsigned char String::changeBuffer(unsigned int maxStrLen)
167168
{
168-
size_t newSize = (maxStrLen + 16) & (~0xf);
169-
char *newbuffer = (char *) malloc(newSize);
169+
size_t newSize = ((maxStrLen + 16) & (~0xf)) - 1;
170+
char *newbuffer = (char *) realloc(buffer, newSize+1);
170171
if(newbuffer) {
171-
memset(newbuffer, 0, newSize);
172-
memcpy(newbuffer, buffer, len);
173-
if (buffer) {
174-
free(buffer);
172+
if(newSize > len){
173+
if(newSize > capacity){
174+
memset(newbuffer+capacity, 0, newSize-capacity);
175+
}
176+
} else {
177+
//new buffer can not fit the old len
178+
newbuffer[newSize] = 0;
179+
len = newSize;
175180
}
176-
capacity = newSize - 1;
181+
capacity = newSize;
177182
buffer = newbuffer;
178183
return 1;
179184
}
180-
buffer = newbuffer;
185+
log_e("realloc failed! Buffer unchanged");
181186
return 0;
182187
}
183188

0 commit comments

Comments
 (0)