Skip to content

Commit d05d6ab

Browse files
authored
Merge pull request #1726 from weebl2000/fix-packet-pool-leak-queue-full
Fix packet pool leak when rx queue is full
2 parents c2abe89 + ffc9815 commit d05d6ab

2 files changed

Lines changed: 12 additions & 6 deletions

File tree

src/helpers/StaticPoolPacketManager.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ mesh::Packet* PacketQueue::removeByIdx(int i) {
5555
return item;
5656
}
5757

58-
void PacketQueue::add(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for) {
58+
bool PacketQueue::add(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for) {
5959
if (_num == _size) {
60-
// TODO: log "FATAL: queue is full!"
61-
return;
60+
return false;
6261
}
6362
_table[_num] = packet;
6463
_pri_table[_num] = priority;
6564
_schedule_table[_num] = scheduled_for;
6665
_num++;
66+
return true;
6767
}
6868

6969
StaticPoolPacketManager::StaticPoolPacketManager(int pool_size): unused(pool_size), send_queue(pool_size), rx_queue(pool_size) {
@@ -82,7 +82,10 @@ void StaticPoolPacketManager::free(mesh::Packet* packet) {
8282
}
8383

8484
void StaticPoolPacketManager::queueOutbound(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for) {
85-
send_queue.add(packet, priority, scheduled_for);
85+
if (!send_queue.add(packet, priority, scheduled_for)) {
86+
MESH_DEBUG_PRINTLN("queueOutbound: send queue full, dropping packet");
87+
free(packet);
88+
}
8689
}
8790

8891
mesh::Packet* StaticPoolPacketManager::getNextOutbound(uint32_t now) {
@@ -106,7 +109,10 @@ mesh::Packet* StaticPoolPacketManager::removeOutboundByIdx(int i) {
106109
}
107110

108111
void StaticPoolPacketManager::queueInbound(mesh::Packet* packet, uint32_t scheduled_for) {
109-
rx_queue.add(packet, 0, scheduled_for);
112+
if (!rx_queue.add(packet, 0, scheduled_for)) {
113+
MESH_DEBUG_PRINTLN("queueInbound: rx queue full, dropping packet");
114+
free(packet);
115+
}
110116
}
111117
mesh::Packet* StaticPoolPacketManager::getNextInbound(uint32_t now) {
112118
return rx_queue.get(now);

src/helpers/StaticPoolPacketManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class PacketQueue {
1111
public:
1212
PacketQueue(int max_entries);
1313
mesh::Packet* get(uint32_t now);
14-
void add(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for);
14+
bool add(mesh::Packet* packet, uint8_t priority, uint32_t scheduled_for);
1515
int count() const { return _num; }
1616
int countBefore(uint32_t now) const;
1717
mesh::Packet* itemAt(int i) const { return _table[i]; }

0 commit comments

Comments
 (0)