Skip to content

[Bug]: Memory leaks in MQTT::onReceive #5549

@esev

Description

@esev

Category

Other

Hardware

Not Applicable

Firmware Version

2.5.16.f81d3b0

Description

I believe there are two potential memory leaks in src/mqtt/MQTT.cpp MQTT::onReceive

  1. return;
    Any pointers within the meshtastic_ServiceEnvelope that are non-NULL are leaked.

  2. if (isToUs(p) || (tx && tx->has_user && rx && rx->has_user))
    The meshtastic_MeshPacket *p is leaked when the if statement evaluates to false

There are several places in MQTT::onReceive where calls to free/release are needed. If I may offer a suggestion; use std::unique_ptr to help ensure these are always freed/released on return

Example:

// make sure to free both strings and the MeshPacket (passing in NULL is acceptable)
struct ServiceEnvelopeCleaner {
    void operator()(meshtastic_ServiceEnvelope *e)
    {
        free(e->channel_id);
        free(e->gateway_id);
        free(e->packet);
    }
};
using ScopedServiceEnvelopeReleaser = std::unique_ptr<meshtastic_ServiceEnvelope, ServiceEnvelopeCleaner>;
struct PacketPoolMeshPacketReleaser {
    void operator()(meshtastic_MeshPacket *p)
    {
        packetPool.release(p);
    }
};
using PacketPoolMeshPacketPtr = std::unique_ptr<meshtastic_MeshPacket, PacketPoolMeshPacketReleaser>;

...

ScopedServiceEnvelopeReleaser cleanup_e(&e);

...

PacketPoolMeshPacketPtr p(packetPool.allocCopy(*e.packet));

...

router->enqueueReceivedMessage(p.release());

Relevant log output

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinggood first issueGood for newcomershelp wantedWe'd welcome help on this issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions