From 4d4c5dd5a2a827626944f321778032d5533515d7 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Tue, 30 Jul 2019 18:42:31 +0100 Subject: [PATCH] Make behaviour of `mosquitto_connect[_async]()` consistent. `mosquitto_connect_async()` is now consistent with `mosquitto_connect()` when connecting to a non-existent server. Closes #1345. Thanks to Mohammad Reza. --- ChangeLog.txt | 3 +++ lib/connect.c | 33 ++++++++++----------------------- lib/packet_mosq.c | 32 ++++++++++++++++++++++++++++++++ lib/packet_mosq.h | 1 + 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index c6e86debd7..3c4898a13e 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,9 @@ Broker: Client library: - Fix MQTT v5 subscription options being incorrectly set for MQTT v3 subscriptions. Closes #1353. +- Make behaviour of `mosquitto_connect_async()` consistent with + `mosquitto_connect()` when connecting to a non-existent server. + Closes #1345. Clients: - mosquitto_pub: fix error codes not being returned when mosquitto_pub exits. diff --git a/lib/connect.c b/lib/connect.c index 7543d4af74..8559cd727a 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -163,7 +163,6 @@ static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking, const mos const mosquitto_property *outgoing_properties = NULL; mosquitto_property local_property; int rc; - struct mosquitto__packet *packet; if(!mosq) return MOSQ_ERR_INVAL; if(!mosq->host || mosq->port <= 0) return MOSQ_ERR_INVAL; if(mosq->protocol != mosq_p_mqtt5 && properties) return MOSQ_ERR_NOT_SUPPORTED; @@ -201,27 +200,7 @@ static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking, const mos packet__cleanup(&mosq->in_packet); - pthread_mutex_lock(&mosq->current_out_packet_mutex); - pthread_mutex_lock(&mosq->out_packet_mutex); - - if(mosq->out_packet && !mosq->current_out_packet){ - mosq->current_out_packet = mosq->out_packet; - mosq->out_packet = mosq->out_packet->next; - } - - while(mosq->current_out_packet){ - packet = mosq->current_out_packet; - /* Free data and reset values */ - mosq->current_out_packet = mosq->out_packet; - if(mosq->out_packet){ - mosq->out_packet = mosq->out_packet->next; - } - - packet__cleanup(packet); - mosquitto__free(packet); - } - pthread_mutex_unlock(&mosq->out_packet_mutex); - pthread_mutex_unlock(&mosq->current_out_packet_mutex); + packet__cleanup_all(mosq); message__reconnect_reset(mosq); @@ -250,7 +229,15 @@ static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking, const mos }else #endif { - return send__connect(mosq, mosq->keepalive, mosq->clean_start, outgoing_properties); + rc = send__connect(mosq, mosq->keepalive, mosq->clean_start, outgoing_properties); + if(rc){ + packet__cleanup_all(mosq); + net__socket_close(mosq); + pthread_mutex_lock(&mosq->state_mutex); + mosq->state = mosq_cs_new; + pthread_mutex_unlock(&mosq->state_mutex); + } + return rc; } } diff --git a/lib/packet_mosq.c b/lib/packet_mosq.c index 0f7af7426c..22df79e531 100644 --- a/lib/packet_mosq.c +++ b/lib/packet_mosq.c @@ -98,6 +98,38 @@ void packet__cleanup(struct mosquitto__packet *packet) packet->pos = 0; } + +void packet__cleanup_all(struct mosquitto *mosq) +{ + struct mosquitto__packet *packet; + + pthread_mutex_lock(&mosq->current_out_packet_mutex); + pthread_mutex_lock(&mosq->out_packet_mutex); + + /* Out packet cleanup */ + if(mosq->out_packet && !mosq->current_out_packet){ + mosq->current_out_packet = mosq->out_packet; + mosq->out_packet = mosq->out_packet->next; + } + while(mosq->current_out_packet){ + packet = mosq->current_out_packet; + /* Free data and reset values */ + mosq->current_out_packet = mosq->out_packet; + if(mosq->out_packet){ + mosq->out_packet = mosq->out_packet->next; + } + + packet__cleanup(packet); + mosquitto__free(packet); + } + + packet__cleanup(&mosq->in_packet); + + pthread_mutex_unlock(&mosq->out_packet_mutex); + pthread_mutex_unlock(&mosq->current_out_packet_mutex); +} + + int packet__queue(struct mosquitto *mosq, struct mosquitto__packet *packet) { #ifndef WITH_BROKER diff --git a/lib/packet_mosq.h b/lib/packet_mosq.h index 5967f09406..01b7d148cc 100644 --- a/lib/packet_mosq.h +++ b/lib/packet_mosq.h @@ -25,6 +25,7 @@ struct mosquitto_db; int packet__alloc(struct mosquitto__packet *packet); void packet__cleanup(struct mosquitto__packet *packet); +void packet__cleanup_all(struct mosquitto *mosq); int packet__queue(struct mosquitto *mosq, struct mosquitto__packet *packet); int packet__check_oversize(struct mosquitto *mosq, uint32_t remaining_length);