Skip to content

Commit 7360f9c

Browse files
committed
fix(mem): limit the use of std::vector in middleware code that could execute in the context of a request
1 parent 44c5059 commit 7360f9c

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

src/ESPAsyncWebServer.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -789,14 +789,15 @@ class AsyncHeaderFreeMiddleware : public AsyncMiddleware {
789789
void keep(const char *name) {
790790
_toKeep.push_back(name);
791791
}
792+
792793
void unKeep(const char *name) {
793-
_toKeep.erase(std::remove(_toKeep.begin(), _toKeep.end(), name), _toKeep.end());
794+
_toKeep.remove(name);
794795
}
795796

796797
void run(AsyncWebServerRequest *request, ArMiddlewareNext next);
797798

798799
private:
799-
std::vector<const char *> _toKeep;
800+
std::list<const char *> _toKeep;
800801
};
801802

802803
// filter out specific headers from the incoming request
@@ -805,14 +806,15 @@ class AsyncHeaderFilterMiddleware : public AsyncMiddleware {
805806
void filter(const char *name) {
806807
_toRemove.push_back(name);
807808
}
809+
808810
void unFilter(const char *name) {
809-
_toRemove.erase(std::remove(_toRemove.begin(), _toRemove.end(), name), _toRemove.end());
811+
_toRemove.remove(name);
810812
}
811813

812814
void run(AsyncWebServerRequest *request, ArMiddlewareNext next);
813815

814816
private:
815-
std::vector<const char *> _toRemove;
817+
std::list<const char *> _toRemove;
816818
};
817819

818820
// curl-like logging of incoming requests

src/Middleware.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,22 @@ void AsyncAuthenticationMiddleware::run(AsyncWebServerRequest *request, ArMiddle
146146
}
147147

148148
void AsyncHeaderFreeMiddleware::run(AsyncWebServerRequest *request, ArMiddlewareNext next) {
149-
std::vector<const char *> reqHeaders;
150-
request->getHeaderNames(reqHeaders);
151-
for (const char *h : reqHeaders) {
149+
std::list<const char *> toRemove;
150+
for (auto &h : request->getHeaders()) {
152151
bool keep = false;
153152
for (const char *k : _toKeep) {
154-
if (strcasecmp(h, k) == 0) {
153+
if (strcasecmp(h.name().c_str(), k) == 0) {
155154
keep = true;
156155
break;
157156
}
158157
}
159158
if (!keep) {
160-
request->removeHeader(h);
159+
toRemove.push_back(h.name().c_str());
161160
}
162161
}
162+
for (const char *h : toRemove) {
163+
request->removeHeader(h);
164+
}
163165
next();
164166
}
165167

src/WebRequest.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -796,12 +796,11 @@ const AsyncWebHeader *AsyncWebServerRequest::getHeader(size_t num) const {
796796
}
797797

798798
size_t AsyncWebServerRequest::getHeaderNames(std::vector<const char *> &names) const {
799-
const size_t size = _headers.size();
800-
names.reserve(size);
799+
const size_t size = names.size();
801800
for (const auto &h : _headers) {
802801
names.push_back(h.name().c_str());
803802
}
804-
return size;
803+
return names.size() - size;
805804
}
806805

807806
bool AsyncWebServerRequest::removeHeader(const char *name) {

0 commit comments

Comments
 (0)