From 6abee6374eb0967feb39864355a4770660cbf61a Mon Sep 17 00:00:00 2001 From: "Rob Swindell (on Windows 11)" <rob@synchro.net> Date: Wed, 13 Dec 2023 18:54:03 -0800 Subject: [PATCH] Fix crash after failing to connect to MQTT broker We need to call mqtt_shutdown() instead of mqtt_close() to have the mosquitto (loop) thread stopped. Upon connect failure, call the mqtt_shutdown() *before* calling lprintf->lputs, which would eventually try to MQTT-publish the log message. The call to mqtt_connect() can block for a while, so raise the log severity of the "connecting to broker" message from DEBUG to INFO. Otherwise, a bad MQTT broker address or port would make the servers just appear to hang during initialization, for no reason. --- src/sbbs3/mqtt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sbbs3/mqtt.c b/src/sbbs3/mqtt.c index f917eac53e..0994ba4472 100644 --- a/src/sbbs3/mqtt.c +++ b/src/sbbs3/mqtt.c @@ -616,14 +616,14 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const if(mqtt->handle != NULL) mosquitto_connect_callback_set(mqtt->handle, mqtt_connect_callback); #endif - lprintf(lputs, LOG_DEBUG, "MQTT connecting to broker %s:%u", cfg->mqtt.broker_addr, cfg->mqtt.broker_port); + lprintf(lputs, LOG_INFO, "MQTT connecting to broker %s:%u", cfg->mqtt.broker_addr, cfg->mqtt.broker_port); result = mqtt_connect(mqtt, /* bind_address: */NULL); if(result == MQTT_SUCCESS) { lprintf(lputs, LOG_INFO, "MQTT broker-connect (%s:%d) successful", cfg->mqtt.broker_addr, cfg->mqtt.broker_port); mqtt_pub_noval(mqtt, TOPIC_SERVER, "client"); } else { + mqtt_shutdown(mqtt); lprintf(lputs, LOG_ERR, "MQTT broker-connect (%s:%d) failure: %d", cfg->mqtt.broker_addr, cfg->mqtt.broker_port, result); - mqtt_close(mqtt); } } } -- GitLab