Skip to content

Commit f13685e

Browse files
iafiliusme-no-dev
authored andcommitted
AsyncEvents/ServerSideEvents: prevent internal DOS by prevent overflowing messageQueue (me-no-dev#621)
* Prevent tcp/wifi DOS lockup by preventing number of messages in queue, drop otherwise * Define (renamed) MAX_SSE_Clients
1 parent a84f169 commit f13685e

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

src/AsyncEventSource.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,14 @@ void AsyncEventSourceClient::_queueMessage(AsyncEventSourceMessage *dataMessage)
184184
delete dataMessage;
185185
return;
186186
}
187-
188-
_messageQueue.add(dataMessage);
189-
190-
_runQueue();
187+
if(_messageQueue.length() >= SSE_MAX_QUEUED_MESSAGES){
188+
ets_printf("ERROR: Too many messages queued\n");
189+
delete dataMessage;
190+
} else {
191+
_messageQueue.add(dataMessage);
192+
}
193+
if(_client->canSend())
194+
_runQueue();
191195
}
192196

193197
void AsyncEventSourceClient::_onAck(size_t len, uint32_t time){

src/AsyncEventSource.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,28 @@
2323
#include <Arduino.h>
2424
#ifdef ESP32
2525
#include <AsyncTCP.h>
26+
#define SSE_MAX_QUEUED_MESSAGES 32
2627
#else
2728
#include <ESPAsyncTCP.h>
29+
#define SSE_MAX_QUEUED_MESSAGES 8
2830
#endif
2931
#include <ESPAsyncWebServer.h>
3032

33+
#include "AsyncWebSynchronization.h"
34+
35+
#ifdef ESP8266
36+
#include <Hash.h>
37+
#ifdef CRYPTO_HASH_h // include Hash.h from espressif framework if the first include was from the crypto library
38+
#include <../src/Hash.h>
39+
#endif
40+
#endif
41+
42+
#ifdef ESP32
43+
#define DEFAULT_MAX_SSE_CLIENTS 8
44+
#else
45+
#define DEFAULT_MAX_SSE_CLIENTS 4
46+
#endif
47+
3148
class AsyncEventSource;
3249
class AsyncEventSourceResponse;
3350
class AsyncEventSourceClient;

0 commit comments

Comments
 (0)