From 6599a12012b400499fafa803924ea7f53e9c54b1 Mon Sep 17 00:00:00 2001 From: Torsten Stauder Date: Tue, 18 May 2021 22:42:10 +0200 Subject: [PATCH] Fixing heap-corruption --- src/Ftp.cpp | 9 +++++---- src/MemX.cpp | 18 ------------------ src/MemX.h | 1 - src/Mqtt.cpp | 27 ++++++++++++++------------- src/Mqtt.h | 4 ++-- src/Web.cpp | 5 +++-- 6 files changed, 24 insertions(+), 40 deletions(-) diff --git a/src/Ftp.cpp b/src/Ftp.cpp index 2d94087..16e065f 100644 --- a/src/Ftp.cpp +++ b/src/Ftp.cpp @@ -13,8 +13,8 @@ #endif // FTP -char *Ftp_User = x_strndup((char *) "esp32", ftpUserLength); // FTP-user (default; can be changed later via GUI) -char *Ftp_Password = x_strndup((char *) "esp32", ftpPasswordLength); // FTP-password (default; can be changed later via GUI) +String Ftp_User = "esp32"; // FTP-user (default; can be changed later via GUI) +String Ftp_Password = "esp32"; // FTP-password (default; can be changed later via GUI) // FTP #ifdef FTP_ENABLE @@ -26,13 +26,14 @@ bool ftpEnableCurrentStatus = false; void ftpManager(void); void Ftp_Init(void) { + String info; // Get FTP-user from NVS String nvsFtpUser = gPrefsSettings.getString("ftpuser", "-1"); if (!nvsFtpUser.compareTo("-1")) { gPrefsSettings.putString("ftpuser", (String)Ftp_User); Log_Println((char *) FPSTR(wroteFtpUserToNvs), LOGLEVEL_ERROR); } else { - strncpy(Ftp_User, nvsFtpUser.c_str(), ftpUserLength); + Ftp_User = nvsFtpUser; snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(restoredFtpUserFromNvs), nvsFtpUser.c_str()); Log_Println(Log_Buffer, LOGLEVEL_INFO); } @@ -43,7 +44,7 @@ void Ftp_Init(void) { gPrefsSettings.putString("ftppassword", (String)Ftp_Password); Log_Println((char *) FPSTR(wroteFtpPwdToNvs), LOGLEVEL_ERROR); } else { - strncpy(Ftp_Password, nvsFtpPassword.c_str(), ftpPasswordLength); + Ftp_Password = nvsFtpPassword; snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(restoredFtpPwdFromNvs), nvsFtpPassword.c_str()); Log_Println(Log_Buffer, LOGLEVEL_INFO); } diff --git a/src/MemX.cpp b/src/MemX.cpp index 97411e9..c6e3a5f 100644 --- a/src/MemX.cpp +++ b/src/MemX.cpp @@ -16,24 +16,6 @@ char * x_strdup(const char *_str) { } } - -// Wraps strndup(). Without PSRAM, strdup is called => so heap is used. -// With PSRAM being available, the same is done what strndup() does, but with allocation on PSRAM. -char * x_strndup(const char *_str, uint32_t _len) { - if (!psramInit()) { - return strndup(_str, _len); - } else { - char *dst = (char *) ps_malloc(_len + 1); - if (dst == NULL) { - return NULL; - } - strncpy(dst, _str, _len); - dst[_len] = '\0'; - return dst; - } -} - - // Wraps ps_malloc() and malloc(). Selection depends on whether PSRAM is available or not. char * x_malloc(uint32_t _allocSize) { if (psramInit()) { diff --git a/src/MemX.h b/src/MemX.h index 9f976eb..57c13c9 100644 --- a/src/MemX.h +++ b/src/MemX.h @@ -3,4 +3,3 @@ char *x_calloc(uint32_t _allocSize, uint32_t _unitSize); char *x_malloc(uint32_t _allocSize); char *x_strdup(const char *_str); -char *x_strndup(const char *_str, uint32_t _len); \ No newline at end of file diff --git a/src/Mqtt.cpp b/src/Mqtt.cpp index 4e79b16..932617e 100644 --- a/src/Mqtt.cpp +++ b/src/Mqtt.cpp @@ -24,10 +24,10 @@ constexpr uint8_t stillOnlineInterval = 60u; // Interval 'I'm still alive' is se #endif // Please note: all of them are defaults that can be changed later via GUI -char *gMqttServer = x_strndup((char *) "192.168.2.43", mqttServerLength); // IP-address of MQTT-server (if not found in NVS this one will be taken) -char *gMqttUser = x_strndup((char *) "mqtt-user", mqttUserLength); // MQTT-user -char *gMqttPassword = x_strndup((char *) "mqtt-password", mqttPasswordLength); // MQTT-password*/ -uint16_t gMqttPort = 1883; // MQTT-Port +String gMqttServer = "192.168.2.43"; // IP-address of MQTT-server (if not found in NVS this one will be taken) +String gMqttUser = "mqtt-user"; // MQTT-user +String gMqttPassword = "mqtt-password"; // MQTT-password +uint16_t gMqttPort = 1883; // MQTT-Port // MQTT static bool Mqtt_Enabled = true; @@ -60,10 +60,10 @@ void Mqtt_Init() { // Get MQTT-server from NVS String nvsMqttServer = gPrefsSettings.getString("mqttServer", "-1"); if (!nvsMqttServer.compareTo("-1")) { - gPrefsSettings.putString("mqttServer", (String)gMqttServer); + gPrefsSettings.putString("mqttServer", gMqttServer); Log_Println((char *) FPSTR(wroteMqttServerToNvs), LOGLEVEL_ERROR); } else { - strncpy(gMqttServer, nvsMqttServer.c_str(), mqttServerLength); + gMqttServer = nvsMqttServer; snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(restoredMqttServerFromNvs), nvsMqttServer.c_str()); Log_Println(Log_Buffer, LOGLEVEL_INFO); } @@ -74,7 +74,7 @@ void Mqtt_Init() { gPrefsSettings.putString("mqttUser", (String)gMqttUser); Log_Println((char *) FPSTR(wroteMqttUserToNvs), LOGLEVEL_ERROR); } else { - strncpy(gMqttUser, nvsMqttUser.c_str(), mqttUserLength); + gMqttUser = nvsMqttUser; snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(restoredMqttUserFromNvs), nvsMqttUser.c_str()); Log_Println(Log_Buffer, LOGLEVEL_INFO); } @@ -85,7 +85,7 @@ void Mqtt_Init() { gPrefsSettings.putString("mqttPassword", (String)gMqttPassword); Log_Println((char *) FPSTR(wroteMqttPwdToNvs), LOGLEVEL_ERROR); } else { - strncpy(gMqttPassword, nvsMqttPassword.c_str(), mqttPasswordLength); + gMqttPassword = nvsMqttPassword; snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(restoredMqttPwdFromNvs), nvsMqttPassword.c_str()); Log_Println(Log_Buffer, LOGLEVEL_INFO); } @@ -102,7 +102,7 @@ void Mqtt_Init() { // Only enable MQTT if requested if (Mqtt_Enabled) { - Mqtt_PubSubClient.setServer(gMqttServer, gMqttPort); + Mqtt_PubSubClient.setServer(gMqttServer.c_str(), gMqttPort); Mqtt_PubSubClient.setCallback(Mqtt_ClientCallback); } #endif @@ -209,18 +209,18 @@ bool Mqtt_Reconnect() { while (!Mqtt_PubSubClient.connected() && i < mqttMaxRetriesPerInterval) { i++; - snprintf(Log_Buffer, Log_BufferLength, "%s %s", (char *) FPSTR(tryConnectMqttS), gMqttServer); + snprintf(Log_Buffer, Log_BufferLength, "%s %s", (char *) FPSTR(tryConnectMqttS), gMqttServer.c_str()); Log_Println(Log_Buffer, LOGLEVEL_NOTICE); // Try to connect to MQTT-server. If username AND password are set, they'll be used - if (strlen(gMqttUser) < 1 || strlen(gMqttPassword) < 1) { + if ((gMqttUser.length() < 1u) || (gMqttPassword.length()) < 1u) { Log_Println((char *) FPSTR(mqttWithoutPwd), LOGLEVEL_NOTICE); if (Mqtt_PubSubClient.connect(DEVICE_HOSTNAME)) { connect = true; } } else { Log_Println((char *) FPSTR(mqttWithPwd), LOGLEVEL_NOTICE); - if (Mqtt_PubSubClient.connect(DEVICE_HOSTNAME, gMqttUser, gMqttPassword)) { + if (Mqtt_PubSubClient.connect(DEVICE_HOSTNAME, gMqttUser.c_str(), gMqttPassword.c_str())) { connect = true; } } @@ -275,7 +275,8 @@ bool Mqtt_Reconnect() { // Is called if there's a new MQTT-message for us void Mqtt_ClientCallback(const char *topic, const byte *payload, uint32_t length) { #ifdef MQTT_ENABLE - char *receivedString = x_strndup((char *) payload, length); + char *receivedString = (char*)x_calloc(length + 1u, sizeof(char)); + memcpy(receivedString, (char *) payload, length); char *mqttTopic = x_strdup(topic); snprintf(Log_Buffer, Log_BufferLength, "%s: [Topic: %s] [Command: %s]", (char *) FPSTR(mqttMsgReceived), mqttTopic, receivedString); diff --git a/src/Mqtt.h b/src/Mqtt.h index dbd2f86..ee62b81 100644 --- a/src/Mqtt.h +++ b/src/Mqtt.h @@ -10,8 +10,8 @@ constexpr uint8_t mqttServerLength = 32u; constexpr uint8_t mqttUserLength = 16u; constexpr uint8_t mqttPasswordLength = 16u; -extern char *gMqttUser; -extern char *gMqttPassword; +extern String gMqttUser; +extern String gMqttPassword; extern uint16_t gMqttPort; void Mqtt_Init(void); diff --git a/src/Web.cpp b/src/Web.cpp index 1665909..9579630 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -140,16 +140,17 @@ void webserverStart(void) { "/info", HTTP_GET, [](AsyncWebServerRequest *request) { #if (LANGUAGE == 1) String info = "Freier heap: " + String(ESP.getFreeHeap()); + info += "\nGroesster freier heap-block: " + String((uint32_t)heap_caps_get_largest_free_block(MALLOC_CAP_8BIT)); info += "\nFreier PSRAM: "; info += (!psramInit()) ? "nicht verfuegbar" : String(ESP.getFreePsram()); #else String info = "Free heap: " + String(ESP.getFreeHeap()); + info += "\nLargest free heap-block: " + String((uint32_t)heap_caps_get_largest_free_block(MALLOC_CAP_8BIT)); info += "\nFree PSRAM: "; info += (!psramInit()) ? "not available" : String(ESP.getFreePsram()); #endif request->send_P(200, "text/plain", info.c_str()); - }, - handleUpload); + }); // NVS-backup-upload wServer.on(