Skip to content

Commit f1b2e91

Browse files
committed
Fixes from fuzzer. 1) CONNECT decode failure treated as success (mqtt_broker.c:3367). 2) Memory leak in BrokerSubs_Remove (mqtt_broker.c:1584). 3) Memory leak in MqttBroker_Free (mqtt_broker.c:3777)
1 parent e92e5aa commit f1b2e91

1 file changed

Lines changed: 17 additions & 2 deletions

File tree

src/mqtt_broker.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,6 +1581,9 @@ static void BrokerSubs_Remove(MqttBroker* broker, BrokerClient* bc,
15811581
WBLOG_INFO(broker, "broker: sub remove sock=%d filter=%s",
15821582
(int)bc->sock, cur->filter);
15831583
WOLFMQTT_FREE(cur->filter);
1584+
if (cur->client_id) {
1585+
WOLFMQTT_FREE(cur->client_id);
1586+
}
15841587
WOLFMQTT_FREE(cur);
15851588
return;
15861589
}
@@ -3364,8 +3367,8 @@ static int BrokerClient_Process(MqttBroker* broker, BrokerClient* bc)
33643367
case MQTT_PACKET_TYPE_CONNECT:
33653368
{
33663369
int c_rc = BrokerHandle_Connect(bc, rc, broker);
3367-
if (c_rc == 0) {
3368-
/* Auth rejected, disconnect */
3370+
if (c_rc <= 0) {
3371+
/* Decode failed or auth rejected, disconnect */
33693372
BrokerSubs_RemoveClient(broker, bc);
33703373
BrokerClient_Remove(broker, bc);
33713374
return 0;
@@ -3774,6 +3777,18 @@ int MqttBroker_Free(MqttBroker* broker)
37743777
BrokerSubs_RemoveClient(broker, broker->clients);
37753778
BrokerClient_Remove(broker, broker->clients);
37763779
}
3780+
/* Free any orphaned subs (e.g. from clean_session=0 clients) */
3781+
while (broker->subs) {
3782+
BrokerSub* next = broker->subs->next;
3783+
if (broker->subs->filter) {
3784+
WOLFMQTT_FREE(broker->subs->filter);
3785+
}
3786+
if (broker->subs->client_id) {
3787+
WOLFMQTT_FREE(broker->subs->client_id);
3788+
}
3789+
WOLFMQTT_FREE(broker->subs);
3790+
broker->subs = next;
3791+
}
37773792
#endif
37783793

37793794
/* Clean up pending wills and retained messages */

0 commit comments

Comments
 (0)