mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-09-14 15:16:40 +00:00
Fix recv_pkt_region incorrect usage
The `recv_pkt_region` is set when processing a flood packet in `filterRecvFloodPacket` but direct/non-flood packets would never pass through that function, so the pointer was not cleared for them. `sendFloodReply` would then later use it blindly, which meant that the response would either inherit the region from the last flood packet, or refer to a non-initialised pointer if no region floods had been received yet.
This commit is contained in:
@@ -549,8 +549,7 @@ uint32_t MyMesh::getDirectRetransmitDelay(const mesh::Packet *packet) {
|
|||||||
return getRNG()->nextInt(0, 5*t + 1);
|
return getRNG()->nextInt(0, 5*t + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MyMesh::filterRecvFloodPacket(mesh::Packet* pkt) {
|
mesh::DispatcherAction MyMesh::onRecvPacket(mesh::Packet* pkt) {
|
||||||
// just try to determine region for packet (apply later in allowPacketForward())
|
|
||||||
if (pkt->getRouteType() == ROUTE_TYPE_TRANSPORT_FLOOD) {
|
if (pkt->getRouteType() == ROUTE_TYPE_TRANSPORT_FLOOD) {
|
||||||
recv_pkt_region = region_map.findMatch(pkt, REGION_DENY_FLOOD);
|
recv_pkt_region = region_map.findMatch(pkt, REGION_DENY_FLOOD);
|
||||||
} else if (pkt->getRouteType() == ROUTE_TYPE_FLOOD) {
|
} else if (pkt->getRouteType() == ROUTE_TYPE_FLOOD) {
|
||||||
@@ -562,8 +561,7 @@ bool MyMesh::filterRecvFloodPacket(mesh::Packet* pkt) {
|
|||||||
} else {
|
} else {
|
||||||
recv_pkt_region = NULL;
|
recv_pkt_region = NULL;
|
||||||
}
|
}
|
||||||
// do normal processing
|
return Mesh::onRecvPacket(pkt);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const mesh::Identity &sender,
|
void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const mesh::Identity &sender,
|
||||||
@@ -867,6 +865,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
set_radio_at = revert_radio_at = 0;
|
set_radio_at = revert_radio_at = 0;
|
||||||
_logging = false;
|
_logging = false;
|
||||||
region_load_active = false;
|
region_load_active = false;
|
||||||
|
recv_pkt_region = NULL;
|
||||||
|
|
||||||
#if MAX_NEIGHBOURS
|
#if MAX_NEIGHBOURS
|
||||||
memset(neighbours, 0, sizeof(neighbours));
|
memset(neighbours, 0, sizeof(neighbours));
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ protected:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool filterRecvFloodPacket(mesh::Packet* pkt) override;
|
mesh::DispatcherAction onRecvPacket(mesh::Packet* pkt) override;
|
||||||
|
|
||||||
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override;
|
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override;
|
||||||
int searchPeersByHash(const uint8_t* hash) override;
|
int searchPeersByHash(const uint8_t* hash) override;
|
||||||
|
|||||||
@@ -290,8 +290,7 @@ bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MyMesh::filterRecvFloodPacket(mesh::Packet* pkt) {
|
mesh::DispatcherAction MyMesh::onRecvPacket(mesh::Packet* pkt) {
|
||||||
// just try to determine region for packet (apply later in allowPacketForward())
|
|
||||||
if (pkt->getRouteType() == ROUTE_TYPE_TRANSPORT_FLOOD) {
|
if (pkt->getRouteType() == ROUTE_TYPE_TRANSPORT_FLOOD) {
|
||||||
recv_pkt_region = region_map.findMatch(pkt, REGION_DENY_FLOOD);
|
recv_pkt_region = region_map.findMatch(pkt, REGION_DENY_FLOOD);
|
||||||
} else if (pkt->getRouteType() == ROUTE_TYPE_FLOOD) {
|
} else if (pkt->getRouteType() == ROUTE_TYPE_FLOOD) {
|
||||||
@@ -303,8 +302,7 @@ bool MyMesh::filterRecvFloodPacket(mesh::Packet* pkt) {
|
|||||||
} else {
|
} else {
|
||||||
recv_pkt_region = NULL;
|
recv_pkt_region = NULL;
|
||||||
}
|
}
|
||||||
// do normal processing
|
return Mesh::onRecvPacket(pkt);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const mesh::Identity &sender,
|
void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const mesh::Identity &sender,
|
||||||
@@ -627,6 +625,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_logging = false;
|
_logging = false;
|
||||||
region_load_active = false;
|
region_load_active = false;
|
||||||
set_radio_at = revert_radio_at = 0;
|
set_radio_at = revert_radio_at = 0;
|
||||||
|
recv_pkt_region = NULL;
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
memset(&_prefs, 0, sizeof(_prefs));
|
memset(&_prefs, 0, sizeof(_prefs));
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ protected:
|
|||||||
return _prefs.multi_acks;
|
return _prefs.multi_acks;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool filterRecvFloodPacket(mesh::Packet* pkt) override;
|
mesh::DispatcherAction onRecvPacket(mesh::Packet* pkt) override;
|
||||||
|
|
||||||
bool allowPacketForward(const mesh::Packet* packet) override;
|
bool allowPacketForward(const mesh::Packet* packet) override;
|
||||||
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override;
|
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user