From 891646681eb7596b021800485fd0a2b780a6f9ed Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 6 May 2019 08:49:38 +0200 Subject: [PATCH] client_init: fix crashing client upon wrong parameters, init or deinit Closes https://github.com/espressif/esp-idf/issues/3191 --- mqtt_client.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/mqtt_client.c b/mqtt_client.c index 6face26..c643897 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -422,17 +422,25 @@ esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *co return client; _mqtt_init_failed: esp_mqtt_client_destroy(client); - MQTT_API_UNLOCK(client); return NULL; } esp_err_t esp_mqtt_client_destroy(esp_mqtt_client_handle_t client) { + if (client == NULL) { + return ESP_ERR_INVALID_ARG; + } esp_mqtt_client_stop(client); esp_mqtt_destroy_config(client); - esp_transport_list_destroy(client->transport_list); - outbox_destroy(client->outbox); - vEventGroupDelete(client->status_bits); + if (client->transport_list) { + esp_transport_list_destroy(client->transport_list); + } + if (client->outbox) { + outbox_destroy(client->outbox); + } + if (client->status_bits) { + vEventGroupDelete(client->status_bits); + } free(client->mqtt_state.in_buffer); free(client->mqtt_state.out_buffer); vSemaphoreDelete(client->api_lock); @@ -1055,6 +1063,10 @@ static void esp_mqtt_task(void *pv) esp_err_t esp_mqtt_client_start(esp_mqtt_client_handle_t client) { + if (!client) { + ESP_LOGE(TAG, "Client was not initialized"); + return ESP_ERR_INVALID_ARG; + } if (client->state >= MQTT_STATE_INIT) { ESP_LOGE(TAG, "Client has started"); return ESP_FAIL; @@ -1187,6 +1199,11 @@ int esp_mqtt_client_publish(esp_mqtt_client_handle_t client, const char *topic, qos, retain, &pending_msg_id); + if (publish_msg == NULL) { + ESP_LOGE(TAG, "Publish message cannot be created"); + MQTT_API_UNLOCK_FROM_OTHER_TASK(client); + return 0; + } /* We have to set as pending all the qos>0 messages */ if (qos > 0) { client->mqtt_state.outbound_message = publish_msg;