Skip to content

Commit 9ad13e8

Browse files
Merge pull request #457 from ESP32Async/issue/456
fix(http) Do not crash when accessing empty param name or non existing index (closes #456)
2 parents 85a9ea0 + 96b9b95 commit 9ad13e8

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

examples/arduino/Params/Params.ino

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,26 @@ void setup() {
7979
WiFi.softAP("esp-captive");
8080
#endif
8181

82+
// Empty query name must not crash the server.
83+
//
84+
// curl -v "http://192.168.4.1/params?=value"
85+
//
86+
// The empty name is filtered out, so the request has no params.
87+
// Iterating params by index must be safe (no null dereference).
88+
//
89+
server.on("/params", HTTP_GET, [](AsyncWebServerRequest *request) {
90+
size_t count = request->params();
91+
Serial.printf("/params: %u parameter(s)\n", (unsigned)count);
92+
for (size_t i = 0; i < count; i++) {
93+
const AsyncWebParameter *p = request->getParam(i);
94+
Serial.printf(" PARAM[%u]: %s = %s\n", (unsigned)i, p->name().c_str(), p->value().c_str());
95+
}
96+
// access by index on an empty/filtered list must not crash
97+
Serial.printf(" arg(0) = '%s'\n", request->arg((size_t)0).c_str());
98+
Serial.printf(" argName(0) = '%s'\n", request->argName((size_t)0).c_str());
99+
request->send(200, "text/plain", "OK");
100+
});
101+
82102
// Get query parameters
83103
//
84104
// curl -v http://192.168.4.1/?who=Bob

src/WebRequest.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,11 +1393,13 @@ const String &AsyncWebServerRequest::arg(const __FlashStringHelper *data) const
13931393
#endif
13941394

13951395
const String &AsyncWebServerRequest::arg(size_t i) const {
1396-
return getParam(i)->value();
1396+
const AsyncWebParameter *p = getParam(i);
1397+
return p ? p->value() : asyncsrv::emptyString;
13971398
}
13981399

13991400
const String &AsyncWebServerRequest::argName(size_t i) const {
1400-
return getParam(i)->name();
1401+
const AsyncWebParameter *p = getParam(i);
1402+
return p ? p->name() : asyncsrv::emptyString;
14011403
}
14021404

14031405
const String &AsyncWebServerRequest::header(const char *name) const {

0 commit comments

Comments
 (0)