Fix memory leak in mosquitto_tls_opts_set()

When calling mosquitto_tls_opts_set() multiple time in a row
on the same mosquitto context (Example: trying to reconnect
to mqtt broker), some of the tls options are not free, resulting in a memory leak.

The TLS options (tls_version, tls_ciphers) must be free before being set.

Signed-off-by: Guillaume PELLEGRINO <guillaume.pellegrino@yahoo.com>
This commit is contained in:
Guillaume PELLEGRINO 2022-11-09 09:51:26 +01:00
parent 7ff2198c7d
commit 9018f12dfc

View File

@ -228,19 +228,23 @@ int mosquitto_tls_opts_set(struct mosquitto *mosq, int cert_reqs, const char *tl
|| !strcasecmp(tls_version, "tlsv1.2") || !strcasecmp(tls_version, "tlsv1.2")
|| !strcasecmp(tls_version, "tlsv1.1")){ || !strcasecmp(tls_version, "tlsv1.1")){
mosquitto__free(mosq->tls_version);
mosq->tls_version = mosquitto__strdup(tls_version); mosq->tls_version = mosquitto__strdup(tls_version);
if(!mosq->tls_version) return MOSQ_ERR_NOMEM; if(!mosq->tls_version) return MOSQ_ERR_NOMEM;
}else{ }else{
return MOSQ_ERR_INVAL; return MOSQ_ERR_INVAL;
} }
}else{ }else{
mosquitto__free(mosq->tls_version);
mosq->tls_version = mosquitto__strdup("tlsv1.2"); mosq->tls_version = mosquitto__strdup("tlsv1.2");
if(!mosq->tls_version) return MOSQ_ERR_NOMEM; if(!mosq->tls_version) return MOSQ_ERR_NOMEM;
} }
if(ciphers){ if(ciphers){
mosquitto__free(mosq->tls_ciphers);
mosq->tls_ciphers = mosquitto__strdup(ciphers); mosq->tls_ciphers = mosquitto__strdup(ciphers);
if(!mosq->tls_ciphers) return MOSQ_ERR_NOMEM; if(!mosq->tls_ciphers) return MOSQ_ERR_NOMEM;
}else{ }else{
mosquitto__free(mosq->tls_ciphers);
mosq->tls_ciphers = NULL; mosq->tls_ciphers = NULL;
} }