Skip to content

Webserver double freeing _currentHeaders on destruction #4350

Closed
@mongozmaki

Description

@mongozmaki

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions