Closed
Description
Destructor of ESP8266WebServer double-frees _currentHeaders.
The problem is, that the destructor frees _currentHeaders
and sets _headerKeysCount=0
and than calls close()
, which checks if(!_headerKeysCount)
(=true) and calls collectHeaders(0, 0)
which frees _currentHeaders
again (because it is not set to nullptr
).
A fix would be to call close()
in the beginning of the destructor.
A more extensive fix would be to call collectHeaders(0, 0) in begin()
and not in close()
.
Code fixed:
ESP8266WebServer::~ESP8266WebServer() {
//Close here
close();
if (_currentHeaders) {
delete[]_currentHeaders;
}
_headerKeysCount = 0;
RequestHandler* handler = _firstHandler;
while (handler) {
RequestHandler* next = handler->next();
delete handler;
handler = next;
}
//Not here
//close();
}
Sketch
#include <Arduino.h>
void setup() {
Serial.begin(115200);
{
Serial.println("Creating server");
ESP8266WebServer server;
const char * headerkeys[] = { "If-None-Match" };
Serial.println("Setting headers");
//Crashes also without calling collectHeaders
server.collectHeaders(headerkeys, 1);
Serial.println("Begin server");
server.begin();
Serial.println("About to delete server");
} //Deleted here
Serial.println("Server deleted");
}
void loop() {
}
Debug Messages
Creating server
Setting headers
Begin server
About to delete server
*** CRASH ***
Metadata
Metadata
Assignees
Labels
No labels