mirror of
https://github.com/meshcore-dev/meshcore_py.git
synced 2026-06-11 11:56:18 +00:00
G1: NEW-B — wrap parsePacketPayload ADVERT branch in try/except
The ADVERT branch in MeshcorePacketParser.parsePacketPayload reads the flags byte with `pk_buf.read(1)[0]`, which IndexErrors on a short advert payload (the minimum advert is 32 + 4 + 64 + 1 = 101 bytes before any optional fields). Pre-F06, the IndexError would escape as a swallowed task exception. With F06's umbrella now in place it would log and skip the dispatch, but the proposal §4.1 NEW-B asks for a narrower local guard so a malformed advert doesn't poison the rest of the parse path. The optional `lat/lon/feat1/feat2` reads after the flags byte also silently produce zeros on short reads (`int.from_bytes(b"", ...)` returns 0), which would propagate bogus zero coordinates upstream. Wrapping the whole branch limits the blast radius to a single malformed advert. Wrap the entire body of the ADVERT elif (from `pk_buf = io.BytesIO(...)` through the final `log_data["adv_feat2"]` assignment) in `try/except (IndexError, ValueError)` and log a debug message with the exception type, message, and `pkt_payload` length on failure. This matches the defensive pattern the proposal specifies. Finding: NEW-B (S3) File: src/meshcore/meshcore_parser.py
This commit is contained in:
@@ -171,6 +171,7 @@ class MeshcorePacketParser:
|
|||||||
del self.channels_log[:25]
|
del self.channels_log[:25]
|
||||||
|
|
||||||
elif not payload is None and payload_type == 0x04: # Advert
|
elif not payload is None and payload_type == 0x04: # Advert
|
||||||
|
try:
|
||||||
pk_buf = io.BytesIO(pkt_payload)
|
pk_buf = io.BytesIO(pkt_payload)
|
||||||
adv_key = pk_buf.read(32).hex()
|
adv_key = pk_buf.read(32).hex()
|
||||||
adv_timestamp = int.from_bytes(pk_buf.read(4), "little", signed=False)
|
adv_timestamp = int.from_bytes(pk_buf.read(4), "little", signed=False)
|
||||||
@@ -205,5 +206,7 @@ class MeshcorePacketParser:
|
|||||||
log_data["adv_feat1"] = adv_feat1
|
log_data["adv_feat1"] = adv_feat1
|
||||||
if not adv_feat2 is None:
|
if not adv_feat2 is None:
|
||||||
log_data["adv_feat2"] = adv_feat2
|
log_data["adv_feat2"] = adv_feat2
|
||||||
|
except (IndexError, ValueError) as e:
|
||||||
|
logger.debug(f"parsePacketPayload: malformed ADVERT payload ({type(e).__name__}: {e}), len={len(pkt_payload)}")
|
||||||
|
|
||||||
return log_data
|
return log_data
|
||||||
|
|||||||
Reference in New Issue
Block a user