Fix minor leak when cleaning a bridge on exit.

pull/1753/head
Roger A. Light 5 years ago
parent 0edb3e49e7
commit 86e7eed8b7

@ -342,7 +342,7 @@ int bridge__connect(struct mosquitto_db *db, struct mosquitto *context)
bridge__packet_cleanup(context);
db__message_reconnect_reset(db, context);
db__messages_delete(db, context);
db__messages_delete(db, context, false);
/* Delete all local subscriptions even for clean_start==false. We don't
* remove any messages and the next loop carries out the resubscription

@ -97,13 +97,13 @@ struct mosquitto *context__init(struct mosquitto_db *db, mosq_sock_t sock)
* but it will mean that CONNACK messages will never get sent for bad protocol
* versions for example.
*/
void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool do_free)
void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool force_free)
{
struct mosquitto__packet *packet;
if(!context) return;
if(do_free){
if(force_free){
context->clean_start = true;
}
@ -125,10 +125,10 @@ void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool d
context->password = NULL;
net__socket_close(db, context);
if(do_free){
if(force_free){
sub__clean_session(db, context);
}
db__messages_delete(db, context);
db__messages_delete(db, context, force_free);
mosquitto__free(context->address);
context->address = NULL;
@ -159,7 +159,7 @@ void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool d
mosquitto__free(context->adns);
}
#endif
if(do_free){
if(force_free){
mosquitto__free(context);
}
}

@ -565,11 +565,11 @@ void db__messages_delete_list(struct mosquitto_db *db, struct mosquitto_client_m
}
int db__messages_delete(struct mosquitto_db *db, struct mosquitto *context)
int db__messages_delete(struct mosquitto_db *db, struct mosquitto *context, bool force_free)
{
if(!context) return MOSQ_ERR_INVAL;
if(context->clean_start || (context->bridge && context->bridge->clean_start)){
if(force_free || context->clean_start || (context->bridge && context->bridge->clean_start)){
db__messages_delete_list(db, &context->msgs_in.inflight);
db__messages_delete_list(db, &context->msgs_in.queued);
context->msgs_in.msg_bytes = 0;
@ -578,7 +578,7 @@ int db__messages_delete(struct mosquitto_db *db, struct mosquitto *context)
context->msgs_in.msg_count12 = 0;
}
if((context->bridge && context->bridge->clean_start_local)
if(force_free || (context->bridge && context->bridge->clean_start_local)
|| (context->bridge == NULL && context->clean_start)){
db__messages_delete_list(db, &context->msgs_out.inflight);

@ -656,7 +656,7 @@ int db__message_release_incoming(struct mosquitto_db *db, struct mosquitto *cont
int db__message_update_outgoing(struct mosquitto *context, uint16_t mid, enum mosquitto_msg_state state, int qos);
int db__message_write(struct mosquitto_db *db, struct mosquitto *context);
void db__message_dequeue_first(struct mosquitto *context, struct mosquitto_msg_data *msg_data);
int db__messages_delete(struct mosquitto_db *db, struct mosquitto *context);
int db__messages_delete(struct mosquitto_db *db, struct mosquitto *context, bool force_free);
int db__messages_easy_queue(struct mosquitto_db *db, struct mosquitto *context, const char *topic, int qos, uint32_t payloadlen, const void *payload, int retain, uint32_t message_expiry_interval, mosquitto_property **properties);
int db__message_store(struct mosquitto_db *db, const struct mosquitto *source, struct mosquitto_msg_store *stored, uint32_t message_expiry_interval, dbid_t store_id, enum mosquitto_msg_origin origin);
int db__message_store_find(struct mosquitto *context, uint16_t mid, struct mosquitto_msg_store **stored);
@ -688,7 +688,7 @@ void sub__topic_tokens_free(struct sub__token *tokens);
* Context functions
* ============================================================ */
struct mosquitto *context__init(struct mosquitto_db *db, mosq_sock_t sock);
void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool do_free);
void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool force_free);
void context__disconnect(struct mosquitto_db *db, struct mosquitto *context);
void context__add_to_disused(struct mosquitto_db *db, struct mosquitto *context);
void context__free_disused(struct mosquitto_db *db);

Loading…
Cancel
Save