From dd0cb3bdada04d70e4a45de4439ecf70896046de Mon Sep 17 00:00:00 2001 From: bogdan Date: Tue, 15 Aug 2023 10:36:10 +0200 Subject: [PATCH] fixed freeing memory after large size VarValue --- include/SystemApplication.h | 2 +- src/RestApiHandler.c | 32 ++++++++++++++++++++------------ src/SysComm.c | 8 ++++++-- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/include/SystemApplication.h b/include/SystemApplication.h index 1ab64a9..2c04dbb 100644 --- a/include/SystemApplication.h +++ b/include/SystemApplication.h @@ -32,7 +32,7 @@ #define EXPECTED_MAX_DATA_RESPONSE_SIZE (4096) #define VAR_MAX_NAME_LENGTH MAX_DYNVAR_NAME_LENGTH -#define VAR_MAX_VALUE_LENGTH MAX_DYNVAR_LENGTH +#define VAR_MAX_VALUE_LENGTH (2048) typedef enum { diff --git a/src/RestApiHandler.c b/src/RestApiHandler.c index 76b9cf5..0315af3 100644 --- a/src/RestApiHandler.c +++ b/src/RestApiHandler.c @@ -35,7 +35,8 @@ extern SYS_CONFIG SysConfig; static void PrintInterfaceState(char *argres, int rw, esp_netif_t *netif) { - snprintf(argres, MAX_DYNVAR_LENGTH, (netif != NULL && esp_netif_is_netif_up(netif))?"\"CONNECTED\"":"\"DISCONNECTED\""); + snprintf(argres, MAX_DYNVAR_LENGTH, + (netif != NULL && esp_netif_is_netif_up(netif)) ? "\"CONNECTED\"" : "\"DISCONNECTED\""); } static void funct_wifi_stat(char *argres, int rw) @@ -60,21 +61,19 @@ static void funct_gsm_stat(char *argres, int rw) } #endif - static void funct_mqtt_1_stat(char *argres, int rw) { - snprintf(argres, MAX_DYNVAR_LENGTH, (GetMQTT1Connected())?"\"CONNECTED\"":"\"DISCONNECTED\""); + snprintf(argres, MAX_DYNVAR_LENGTH, (GetMQTT1Connected()) ? "\"CONNECTED\"" : "\"DISCONNECTED\""); } static void funct_mqtt_2_stat(char *argres, int rw) { - snprintf(argres, MAX_DYNVAR_LENGTH, (GetMQTT2Connected())?"\"CONNECTED\"":"\"DISCONNECTED\""); + snprintf(argres, MAX_DYNVAR_LENGTH, (GetMQTT2Connected()) ? "\"CONNECTED\"" : "\"DISCONNECTED\""); } static void funct_def_interface(char *argres, int rw) { GetDefaultNetIFName(argres); } - static void funct_time(char *argres, int rw) { time_t now; @@ -140,11 +139,20 @@ static void funct_wifiscan(char *argres, int rw) static void funct_wifiscanres(char *argres, int rw) { int arg = atoi(argres); - wifi_ap_record_t *Rec = GetWiFiAPRecord(arg); - if (!Rec) - return; - snprintf(argres, MAX_DYNVAR_LENGTH, "{\"ssid\":\"%s\",\"rssi\":%i,\"ch\":%d}", Rec->ssid, Rec->rssi, - Rec->primary); + char onerec[64]; + wifi_ap_record_t *Rec; + strcpy(argres, "["); + for (int i = 0; i < arg; i++) + { + Rec = GetWiFiAPRecord(i); + if (!Rec) + return; + snprintf(onerec, MAX_DYNVAR_LENGTH, "{\"ssid\":\"%s\",\"rssi\":%i,\"ch\":%d}", Rec->ssid, Rec->rssi, + Rec->primary); + strcat(argres, onerec); + if (i < arg - 1)strcat(argres, ","); + } + strcat(argres, "]"); } const int hw_rev = CONFIG_BOARD_HARDWARE_REVISION; @@ -293,7 +301,7 @@ esp_err_t SetConfVar(char *name, char *val, rest_var_types *tp) *((int*) V->ref) = constr; break; case VAR_STRING: - case VAR_PASS: + case VAR_PASS: constr = strlen(val); if (constr < V->minlen || constr > V->maxlen) return ESP_ERR_INVALID_ARG; @@ -339,7 +347,7 @@ esp_err_t GetConfVar(char *name, char *val, rest_var_types *tp) break; case VAR_PASS: strcpy(val, "******"); - break; + break; case VAR_IPADDR: esp_ip4addr_ntoa((const esp_ip4_addr_t*) V->ref, val, 16); break; diff --git a/src/SysComm.c b/src/SysComm.c index d3d051a..2cdd0ff 100644 --- a/src/SysComm.c +++ b/src/SysComm.c @@ -89,8 +89,6 @@ static esp_err_t SHA256hmacHash(unsigned char *data, static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) { - char VarName[VAR_MAX_NAME_LENGTH]; - char VarValue[VAR_MAX_VALUE_LENGTH]; struct jReadElement result; const char *err_br; const char *err_desc; @@ -112,6 +110,11 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result); if (result.dataType == JREAD_OBJECT) { //Write variables + char VarName[VAR_MAX_NAME_LENGTH]; + char *VarValue = malloc(VAR_MAX_VALUE_LENGTH); + if (!VarValue) + return SYS_ERROR_NO_MEMORY; + for (int i = 0; i < result.elements; ++i) { jRead_string(MSG->inputDataBuffer, "{'data'{'payload'{'variables'{*", VarName, @@ -150,6 +153,7 @@ static sys_error_code SysPayloadTypeVarsHandler(data_message_t *MSG) jwObj_raw(VarName, VarValue); } + free(VarValue); } else return SYS_ERROR_PARSE_VARIABLES;