From fdf8599aaae1aaaa6831c2768be2ea31074fc3af Mon Sep 17 00:00:00 2001 From: raheelh Date: Mon, 22 Feb 2016 22:57:21 -0600 Subject: [PATCH] Fix a crash in String::changeBuffer() Calling String::reserve() causes a crash if String object was in invalidated state. Per the comment on the method's declaration in ESP_SSD1306.h, This method was supposed to recover invalidated strings. This change fixes the edge case bug in String::changeBuffer() which is the root cause of the crash exposed from String::reserve(). Following test code was used to reproduce the problem and also to validate the fix: String result; while(true){ char c = 'A'; result += c; // the loop will cause malloc() to fail at some point. if (result.c_str()==0) { Serial.println("String INVALIDATED!!!!!"); result.reserve(0); // before fix, this would crash. Serial.println("Trying to empty...."); result=""; Serial.println("Emptied!!!!"); break; } } --- cores/esp8266/WString.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/WString.cpp b/cores/esp8266/WString.cpp index 4ba4b1f9f..95a515c24 100644 --- a/cores/esp8266/WString.cpp +++ b/cores/esp8266/WString.cpp @@ -156,9 +156,11 @@ unsigned char ICACHE_FLASH_ATTR String::changeBuffer(unsigned int maxStrLen) { char *newbuffer = (char *) malloc(newSize); if(newbuffer) { memset(newbuffer, 0, newSize); - memcpy(newbuffer, buffer, len); if (buffer) + { + memcpy(newbuffer, buffer, len); free(buffer); + } capacity = newSize - 1; buffer = newbuffer; return 1;