@@ -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