diff -Naur /tmp/mosquitto-1.6.4/lib/connect.c ./lib/connect.c --- /tmp/mosquitto-1.6.4/lib/connect.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/connect.c 2019-08-07 23:00:43.993719811 -0700 @@ -272,7 +272,7 @@ mosq->state = mosq_cs_disconnecting; pthread_mutex_unlock(&mosq->state_mutex); - if(mosq->sock == INVALID_SOCKET) return MOSQ_ERR_NO_CONN; + // if(mosq->sock == INVALID_SOCKET) return MOSQ_ERR_NO_CONN; return send__disconnect(mosq, reason_code, outgoing_properties); } diff -Naur /tmp/mosquitto-1.6.4/lib/handle_ping.c ./lib/handle_ping.c --- /tmp/mosquitto-1.6.4/lib/handle_ping.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/handle_ping.c 2019-08-07 23:08:46.798702752 -0700 @@ -55,9 +55,12 @@ { assert(mosq); + pthread_mutex_lock(&mosq->state_mutex); if(mosq->state != mosq_cs_connected){ + pthread_mutex_unlock(&mosq->state_mutex); return MOSQ_ERR_PROTOCOL; } + pthread_mutex_unlock(&mosq->state_mutex); mosq->ping_t = 0; /* No longer waiting for a PINGRESP. */ #ifdef WITH_BROKER diff -Naur /tmp/mosquitto-1.6.4/lib/handle_pubackcomp.c ./lib/handle_pubackcomp.c --- /tmp/mosquitto-1.6.4/lib/handle_pubackcomp.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/handle_pubackcomp.c 2019-08-07 23:02:44.792973223 -0700 @@ -50,9 +50,12 @@ assert(mosq); + pthread_mutex_lock(&mosq->state_mutex); if(mosq->state != mosq_cs_connected){ + pthread_mutex_unlock(&mosq->state_mutex); return MOSQ_ERR_PROTOCOL; } + pthread_mutex_unlock(&mosq->state_mutex); pthread_mutex_lock(&mosq->msgs_out.mutex); util__increment_send_quota(mosq); diff -Naur /tmp/mosquitto-1.6.4/lib/handle_publish.c ./lib/handle_publish.c --- /tmp/mosquitto-1.6.4/lib/handle_publish.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/handle_publish.c 2019-08-08 12:31:11.687790234 -0700 @@ -43,9 +43,12 @@ assert(mosq); + pthread_mutex_lock(&mosq->state_mutex); if(mosq->state != mosq_cs_connected){ + pthread_mutex_unlock(&mosq->state_mutex); return MOSQ_ERR_PROTOCOL; } + pthread_mutex_unlock(&mosq->state_mutex); message = mosquitto__calloc(1, sizeof(struct mosquitto_message_all)); if(!message) return MOSQ_ERR_NOMEM; diff -Naur /tmp/mosquitto-1.6.4/lib/handle_suback.c ./lib/handle_suback.c --- /tmp/mosquitto-1.6.4/lib/handle_suback.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/handle_suback.c 2019-08-07 23:04:21.152373047 -0700 @@ -43,9 +43,12 @@ assert(mosq); + pthread_mutex_lock(&mosq->state_mutex); if(mosq->state != mosq_cs_connected){ + pthread_mutex_unlock(&mosq->state_mutex); return MOSQ_ERR_PROTOCOL; } + pthread_mutex_unlock(&mosq->state_mutex); #ifdef WITH_BROKER log__printf(NULL, MOSQ_LOG_DEBUG, "Received SUBACK from %s", mosq->id); diff -Naur /tmp/mosquitto-1.6.4/lib/packet_mosq.c ./lib/packet_mosq.c --- /tmp/mosquitto-1.6.4/lib/packet_mosq.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/packet_mosq.c 2019-08-08 12:34:57.486324078 -0700 @@ -174,11 +174,12 @@ #endif } - if(mosq->in_callback == false && mosq->threaded == mosq_ts_none){ + if(mosq->threaded == mosq_ts_none){ + if(mosq->in_callback == false){ return packet__write(mosq); - }else{ - return MOSQ_ERR_SUCCESS; - } + } + } + return MOSQ_ERR_SUCCESS; #endif } @@ -217,14 +218,17 @@ } pthread_mutex_unlock(&mosq->out_packet_mutex); + pthread_mutex_lock(&mosq->state_mutex); #if defined(WITH_TLS) && !defined(WITH_BROKER) if((mosq->state == mosq_cs_connect_pending) || mosq->want_connect){ #else if(mosq->state == mosq_cs_connect_pending){ #endif + pthread_mutex_unlock(&mosq->state_mutex); pthread_mutex_unlock(&mosq->current_out_packet_mutex); return MOSQ_ERR_SUCCESS; } + pthread_mutex_unlock(&mosq->state_mutex); while(mosq->current_out_packet){ packet = mosq->current_out_packet; @@ -319,9 +323,12 @@ if(mosq->sock == INVALID_SOCKET){ return MOSQ_ERR_NO_CONN; } + pthread_mutex_lock(&mosq->state_mutex); if(mosq->state == mosq_cs_connect_pending){ + pthread_mutex_unlock(&mosq->state_mutex); return MOSQ_ERR_SUCCESS; } + pthread_mutex_unlock(&mosq->state_mutex); /* This gets called if pselect() indicates that there is network data * available - ie. at least one byte. What we do depends on what data we diff -Naur /tmp/mosquitto-1.6.4/lib/util_mosq.c ./lib/util_mosq.c --- /tmp/mosquitto-1.6.4/lib/util_mosq.c 2019-08-01 12:50:01.000000000 -0700 +++ ./lib/util_mosq.c 2019-08-08 12:41:19.283074648 -0700 @@ -88,7 +88,9 @@ if(mosq->keepalive && mosq->sock != INVALID_SOCKET && (now >= next_msg_out || now - last_msg_in >= mosq->keepalive)){ + pthread_mutex_lock(&mosq->state_mutex); if(mosq->state == mosq_cs_connected && mosq->ping_t == 0){ + pthread_mutex_unlock(&mosq->state_mutex); send__pingreq(mosq); /* Reset last msg times to give the server time to send a pingresp */ pthread_mutex_lock(&mosq->msgtime_mutex);