diff --git a/src/mesh/MemoryPool.h b/src/mesh/MemoryPool.h index d10c8cf96..ed20fb334 100644 --- a/src/mesh/MemoryPool.h +++ b/src/mesh/MemoryPool.h @@ -114,7 +114,10 @@ template class MemoryDynamic : public Allocator virtual T *alloc(TickType_t maxWait) override { T *p = (T *)malloc(sizeof(T)); - assert(p); + if (!p) { + LOG_WARN("malloc(%u) failed, heap exhausted!", (unsigned)sizeof(T)); + return nullptr; + } this->auditAdd((int32_t)sizeof(T)); return p; } diff --git a/src/mesh/udp/UdpMulticastHandler.h b/src/mesh/udp/UdpMulticastHandler.h index 93f5dd6ac..5a949c91a 100644 --- a/src/mesh/udp/UdpMulticastHandler.h +++ b/src/mesh/udp/UdpMulticastHandler.h @@ -84,6 +84,8 @@ class UdpMulticastHandler final mp.pki_encrypted = false; mp.public_key.size = 0; UniquePacketPoolPacket p = packetPool.allocUniqueCopy(mp); + if (!p) + return; // Unset received SNR/RSSI p->rx_snr = 0; p->rx_rssi = 0; diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 251c632a1..6427b4c31 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -143,6 +143,8 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) } UniquePacketPoolPacket p = packetPool.allocUniqueZeroed(); + if (!p) + return; p->from = e.packet->from; p->to = e.packet->to; p->id = e.packet->id; diff --git a/src/platform/portduino/SimRadio.cpp b/src/platform/portduino/SimRadio.cpp index d0f2f1140..2786903eb 100644 --- a/src/platform/portduino/SimRadio.cpp +++ b/src/platform/portduino/SimRadio.cpp @@ -323,13 +323,19 @@ void SimRadio::startReceive(meshtastic_MeshPacket *p) return; } } - isReceiving = true; receivingPacket = packetPool.allocCopy(*p); + if (!receivingPacket) { + return; + } + isReceiving = true; uint32_t airtimeMsec = getPacketTime(p, true); notifyLater(airtimeMsec, ISR_RX, false); // Model the time it is busy receiving #else - isReceiving = true; receivingPacket = packetPool.allocCopy(*p); + if (!receivingPacket) { + return; + } + isReceiving = true; handleReceiveInterrupt(); // Simulate receiving the packet immediately startTransmitTimer(); #endif