Skip to content

Commit 4ef4259

Browse files
committed
fix infinite loop in WiFi frame skip when read fails
The frame-skip loops in checkRecvFrame subtract the return value of client.read() from frame_length. On ESP32, WiFiClient::read() returns -1 on error. Subtracting -1 increments frame_length instead of decrementing it, turning the loop into an infinite hang. A WiFi client can trigger this by sending a frame header with a large length and then disconnecting (or sending fewer bytes than claimed). The node locks up in the skip loop and stops processing all traffic. Switch to single-byte client.read() which returns the byte value or -1, and break out of the loop on error. Decrement frame_length by exactly 1 per successful read.
1 parent b67decf commit 4ef4259

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

src/helpers/esp32/SerialWifiInterface.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) {
131131
if(frame_length > MAX_FRAME_SIZE){
132132
WIFI_DEBUG_PRINTLN("Skipping frame: length=%d is larger than MAX_FRAME_SIZE=%d", frame_length, MAX_FRAME_SIZE);
133133
while(frame_length > 0){
134-
uint8_t skip[1];
135-
int skipped = client.read(skip, 1);
136-
frame_length -= skipped;
134+
int skipped = client.read();
135+
if(skipped < 0) break; // read error, stop draining
136+
frame_length--;
137137
}
138138
resetReceivedFrameHeader();
139139
return 0;
@@ -144,9 +144,9 @@ size_t SerialWifiInterface::checkRecvFrame(uint8_t dest[]) {
144144
if(frame_type != '<'){
145145
WIFI_DEBUG_PRINTLN("Skipping frame: type=0x%x is unexpected", frame_type);
146146
while(frame_length > 0){
147-
uint8_t skip[1];
148-
int skipped = client.read(skip, 1);
149-
frame_length -= skipped;
147+
int skipped = client.read();
148+
if(skipped < 0) break; // read error, stop draining
149+
frame_length--;
150150
}
151151
resetReceivedFrameHeader();
152152
return 0;

0 commit comments

Comments
 (0)