Description
This is definitely what I'd call a "bug" but I'm not sure what can be done about it, short of try/throw/catch mechanism in all of the library which prints a nicer message than mine...although that at least would have saved me the last two days in finding this! (NOT using arduino strings, perhaps? that what I'm about to do...suggestions welcomed for best way of reading large file from SPIFFS in low-memory situations?)
To the problem...
When realloc fails and returns a zero value, we just stick the invalid pointer it straight into the buffer! The situation occured in my scenario where I was trying to read a SPIFFS file of 10k plus and though there was still plenty of heap space, the largest block available was 8k ( only sometimes though, which is why it took me so long to find. Of course when there is low fragmentation and a 16k block is free, no problem)
I'm sure you must know about this already, but...
unsigned char String::changeBuffer(unsigned int maxStrLen) {
size_t newSize = (maxStrLen + 16) & (~0xf);
char *newbuffer = (char *) realloc(buffer, newSize); // ***** here's where the problem starts...
if(newbuffer) {
size_t oldSize = capacity + 1; // include NULL.
if (newSize > oldSize)
{
memset(newbuffer + oldSize, 0, newSize - oldSize);
}
capacity = newSize - 1;
buffer = newbuffer;
return 1;
}
buffer = newbuffer;
// PMB HACK
if(!buffer) Serial.println("************** PREPARE TO MEET THY DOOM! ************");
return 0;
}