Fix infinite loop in WiFi frame skip when read fails #1660
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Severity: High
Summary
The WiFi interface's
checkRecvFramehas two frame-skip loops that drain oversized or unexpected frames by reading one byte at a time. Each loop subtracts the return value ofclient.read(skip, 1)fromframe_length. On ESP32,WiFiClient::read()returns-1on error (disconnect, timeout). Subtracting-1incrementsframe_lengthinstead of decrementing it, turning the loop into an infinite hang.How this can be exploited
A WiFi-connected client (e.g. a phone app, or anyone on the same WiFi network) can trigger this by:
The node enters the skip loop,
client.read()returns -1 on the dead connection,frame_lengthincreases on every iteration, and the loop never terminates. The node is now permanently hung — it can't process any radio traffic, BLE commands, or further WiFi connections. A physical reset is required to recover.Users would see their node become completely unresponsive after a WiFi client connects and disconnects.
Fix
Switch from
client.read(buf, 1)(which returns bytes read, possibly -1) toclient.read()(single-byte read) and break on negative return. Decrementframe_lengthby exactly 1 per successful read. Both skip loops are fixed.Test plan
Heltec_v3_companion_radio_ble