From 47116f65cdd9e33227f7fe0f02dbd5dff99222e6 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Mon, 18 Nov 2024 18:02:15 +0100 Subject: [PATCH] Guard against clients setting `next_hop`/`relay_node` --- src/mesh/MeshService.cpp | 4 +++- src/mesh/MeshTypes.h | 2 ++ src/mesh/RadioLibInterface.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index 50a13da6a..4b1a178cf 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -190,7 +190,9 @@ void MeshService::handleToRadio(meshtastic_MeshPacket &p) return; } #endif - p.from = 0; // We don't let phones assign nodenums to their sent messages + p.from = 0; // We don't let clients assign nodenums to their sent messages + p.next_hop = NO_NEXT_HOP_PREFERENCE; // We don't let clients assign next_hop to their sent messages + p.relay_node = NO_RELAY_NODE; // We don't let clients assign relay_node to their sent messages if (p.id == 0) p.id = generatePacketId(); // If the phone didn't supply one, then pick one diff --git a/src/mesh/MeshTypes.h b/src/mesh/MeshTypes.h index 0f14fe4cb..3f25082f1 100644 --- a/src/mesh/MeshTypes.h +++ b/src/mesh/MeshTypes.h @@ -42,6 +42,8 @@ enum RxSource { // For old firmware or when falling back to flooding, there is no next-hop preference #define NO_NEXT_HOP_PREFERENCE 0 +// For old firmware there is no relay node set +#define NO_RELAY_NODE 0 typedef int ErrorCode; diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index eece61ca5..433874523 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -439,7 +439,7 @@ void RadioLibInterface::handleReceiveInterrupt() mp->via_mqtt = !!(radioBuffer.header.flags & PACKET_FLAGS_VIA_MQTT_MASK); // If hop_start is not set, next_hop and relay_node are invalid (firmware <2.3) mp->next_hop = mp->hop_start == 0 ? NO_NEXT_HOP_PREFERENCE : radioBuffer.header.next_hop; - mp->relay_node = mp->hop_start == 0 ? NO_NEXT_HOP_PREFERENCE : radioBuffer.header.relay_node; + mp->relay_node = mp->hop_start == 0 ? NO_RELAY_NODE : radioBuffer.header.relay_node; addReceiveMetadata(mp);