-
Notifications
You must be signed in to change notification settings - Fork 13.3k
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 ***
tablatronix
Metadata
Metadata
Assignees
Labels
No labels