Browse Source

Fixing heap-corruption

master
Torsten Stauder 4 years ago
parent
commit
6599a12012
  1. 9
      src/Ftp.cpp
  2. 18
      src/MemX.cpp
  3. 1
      src/MemX.h
  4. 27
      src/Mqtt.cpp
  5. 4
      src/Mqtt.h
  6. 5
      src/Web.cpp

9
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);
}

18
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()) {

1
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);

27
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);

4
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);

5
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(

Loading…
Cancel
Save