diff -r 88c398efc728 -r fcfc3dbe85fa thermferm/mqtt.c --- a/thermferm/mqtt.c Thu Aug 02 13:39:30 2018 +0200 +++ b/thermferm/mqtt.c Fri Aug 03 16:13:17 2018 +0200 @@ -284,7 +284,7 @@ profiles_list *profile; prof_step *pstep; - payload = xstrcat(payload, (char *)"{"); + payload = xstrcpy((char *)"{"); /* * Fixed unit values, never change these! @@ -560,7 +560,7 @@ */ void publishDBirthAll(void) { - char *payload = NULL; + char *topic = NULL, *payload = NULL, *payloadu = NULL; units_list *unit; int comma = FALSE; @@ -570,13 +570,19 @@ if (unit->mode != UNITMODE_OFF) { if (comma) payload = xstrcat(payload, (char *)","); - payload = xstrcat(payload, unit_data(unit, true)); + payloadu = unit_data(unit, true); + payload = xstrcat(payload, payloadu); comma = TRUE; + free(payloadu); + payloadu = NULL; } } if (comma) { // Only publish if there is at least one unit active. payload = xstrcat(payload, (char *)"]}}"); - publisher(mosq, topic_base((char *)"DBIRTH"), payload, true); + topic = topic_base((char *)"DBIRTH"); + publisher(mosq, topic, payload, true); + free(topic); + topic = NULL; } free(payload); payload = NULL; @@ -586,17 +592,20 @@ void publishDData(units_list *unit) { - char *payload = NULL, *topic = NULL; + char *payload = NULL, *payloadu = NULL, *topic = NULL; if (mqtt_use) { payload = payload_header(); - payload = xstrcat(payload, unit_data(unit, false)); + payloadu = unit_data(unit, false); + payload = xstrcat(payload, payloadu); payload = xstrcat(payload, (char *)"}"); topic = xstrcat(topic_base((char *)"DDATA"), (char *)"/"); topic = xstrcat(topic, unit->alias); publisher(mosq, topic, payload, false); free(payload); payload = NULL; + free(payloadu); + payloadu = NULL; free(topic); topic = NULL; } @@ -778,7 +787,7 @@ void publishNData(bool birth, int flag) { - char *payload = NULL, sidx[10], buf[64]; + char *topic = NULL, *payload = NULL, sidx[10], buf[64]; struct utsname ubuf; bool comma = false; @@ -887,11 +896,15 @@ neterr: payload = xstrcat(payload, (char *)"}}"); - if (birth) - publisher(mosq, topic_base((char *)"NBIRTH"), payload, true); - else - publisher(mosq, topic_base((char *)"NDATA"), payload, false); - + if (birth) { + topic = topic_base((char *)"NBIRTH"); + publisher(mosq, topic, payload, true); + } else { + topic = topic_base((char *)"NDATA"); + publisher(mosq, topic, payload, false); + } + free(topic); + topic = NULL; free(payload); payload = NULL; @@ -914,7 +927,7 @@ void mqtt_connect(void) { - char *id = NULL; + char *id = NULL, *topic; char err[1024]; int rc; @@ -945,16 +958,20 @@ mosquitto_lib_cleanup(); return; } + free(id); + id = NULL; /* * Set our will */ - if ((rc = mosquitto_will_set(mosq, topic_base((char *)"NDEATH"), 0, NULL, mqtt_qos, false))) { + topic = topic_base((char *)"NDEATH"); + if ((rc = mosquitto_will_set(mosq, topic, 0, NULL, mqtt_qos, false))) { if (rc > MOSQ_ERR_SUCCESS) syslog(LOG_NOTICE, "MQTT: mosquitto_will_set: %s", mosquitto_strerror(rc)); mosquitto_lib_cleanup(); return; } + free(topic); if (debug) mosquitto_log_callback_set(mosq, my_log_callback); @@ -991,6 +1008,7 @@ void mqtt_disconnect(void) { int rc; + char *topic; if (mqtt_use) { /* @@ -998,10 +1016,18 @@ * After that, remove the retained topic. */ syslog(LOG_NOTICE, "MQTT disconnecting"); - publisher(mosq, topic_base((char *)"DBIRTH"), NULL, true); // Not always needed, but ... - publisher(mosq, topic_base((char *)"DDEATH"), NULL, true); - publisher(mosq, topic_base((char *)"NBIRTH"), NULL, true); - publisher(mosq, topic_base((char *)"NDEATH"), NULL, true); + topic = topic_base((char *)"DBIRTH"); + publisher(mosq, topic, NULL, true); // Not always needed, but ... + free(topic); + topic = topic_base((char *)"DDEATH"); + publisher(mosq, topic, NULL, true); + free(topic); + topic = topic_base((char *)"NBIRTH"); + publisher(mosq, topic, NULL, true); + free(topic); + topic = topic_base((char *)"NDEATH"); + publisher(mosq, topic, NULL, true); + free(topic); mqtt_last_mid = mqtt_mid_sent; mqtt_status = STATUS_WAITING; mqtt_my_shutdown = TRUE;