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