mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-21 01:36:31 +00:00
fix memory leak in >w x (#20473)
This commit is contained in:
parent
b0f4542707
commit
fa6d18a505
@ -341,17 +341,10 @@ typedef union {
|
|||||||
} SCRIPT_TYPE;
|
} SCRIPT_TYPE;
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
struct T_INDEX {
|
struct T_INDEX {
|
||||||
uint16_t index;
|
uint16_t index;
|
||||||
SCRIPT_TYPE bits;
|
SCRIPT_TYPE bits;
|
||||||
};
|
};
|
||||||
#else
|
|
||||||
struct T_INDEX {
|
|
||||||
uint8_t index;
|
|
||||||
SCRIPT_TYPE bits;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct M_FILT {
|
struct M_FILT {
|
||||||
#ifdef LARGE_ARRAYS
|
#ifdef LARGE_ARRAYS
|
||||||
@ -570,6 +563,10 @@ struct SCRIPT_MEM {
|
|||||||
WiFiClient tcp_client;
|
WiFiClient tcp_client;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SCRIPT_FULL_WEBPAGE
|
||||||
|
uint8_t wsp;
|
||||||
|
#endif
|
||||||
|
|
||||||
} glob_script_mem;
|
} glob_script_mem;
|
||||||
|
|
||||||
|
|
||||||
@ -621,6 +618,7 @@ char *scripter_sub(char *lp, uint8_t fromscriptcmd);
|
|||||||
char *GetNumericArgument(char *lp,uint8_t lastop,TS_FLOAT *fp, struct GVARS *gv);
|
char *GetNumericArgument(char *lp,uint8_t lastop,TS_FLOAT *fp, struct GVARS *gv);
|
||||||
char *GetStringArgument(char *lp,uint8_t lastop,char *cp, struct GVARS *gv);
|
char *GetStringArgument(char *lp,uint8_t lastop,char *cp, struct GVARS *gv);
|
||||||
char *ForceStringVar(char *lp,char *dstr);
|
char *ForceStringVar(char *lp,char *dstr);
|
||||||
|
char *GetLongIString(char *lp, char **dstr);
|
||||||
void send_download(void);
|
void send_download(void);
|
||||||
uint8_t UfsReject(char *name);
|
uint8_t UfsReject(char *name);
|
||||||
#ifdef USE_UFILESYS
|
#ifdef USE_UFILESYS
|
||||||
@ -755,6 +753,10 @@ char *script;
|
|||||||
return -7;
|
return -7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SCRIPT_FULL_WEBPAGE
|
||||||
|
// glob_script_mem.wsp = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
char *vnames = (char*)imemptr;
|
char *vnames = (char*)imemptr;
|
||||||
|
|
||||||
char *vnp[maxvars];
|
char *vnp[maxvars];
|
||||||
@ -3522,10 +3524,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
|
|||||||
// read file from web
|
// read file from web
|
||||||
lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv);
|
lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv);
|
||||||
SCRIPT_SKIP_SPACES
|
SCRIPT_SKIP_SPACES
|
||||||
char url[SCRIPT_MAXSSIZE];
|
char *url;
|
||||||
lp = ForceStringVar(lp, url);
|
lp = GetLongIString(lp, &url);
|
||||||
SCRIPT_SKIP_SPACES
|
if (url) {
|
||||||
fvar = url2file(fvar, url);
|
fvar = url2file(fvar, url);
|
||||||
|
}
|
||||||
|
if (url) free(url);
|
||||||
goto nfuncexit;
|
goto nfuncexit;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -3788,6 +3792,70 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
|
|||||||
goto nfuncexit;
|
goto nfuncexit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strncmp_XP(lp, XPSTR("fcs("), 4)) {
|
||||||
|
lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv);
|
||||||
|
uint8_t find = fvar;
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
char delim[SCRIPT_MAXSSIZE];
|
||||||
|
lp = GetStringArgument(lp, OPER_EQU, delim, 0);
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv);
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
uint8_t index = fvar;
|
||||||
|
if (!index) index = 1;
|
||||||
|
char delimc = 0;
|
||||||
|
if (*lp != ')') {
|
||||||
|
// get delimiter
|
||||||
|
delimc = *lp;
|
||||||
|
lp++;
|
||||||
|
}
|
||||||
|
char fstr[SCRIPT_MAXSSIZE];
|
||||||
|
fstr[0] = 0;
|
||||||
|
bool match = false;
|
||||||
|
uint8_t dstrlen = strlen(delim);
|
||||||
|
if (glob_script_mem.file_flags[find].is_open) {
|
||||||
|
glob_script_mem.files[find].seek(0, SeekSet);
|
||||||
|
uint8_t first = 0;
|
||||||
|
uint8_t clen = 0;
|
||||||
|
while (glob_script_mem.files[find].available()) {
|
||||||
|
uint8_t buf[1];
|
||||||
|
glob_script_mem.files[find].read(buf, 1);
|
||||||
|
// shift string
|
||||||
|
memmove(&fstr[0], &fstr[1], dstrlen - 1);
|
||||||
|
fstr[dstrlen - 1] = buf[0];
|
||||||
|
if (!strncmp(delim, fstr, dstrlen)) {
|
||||||
|
// match
|
||||||
|
//AddLog(LOG_LEVEL_INFO, PSTR(">>: %s - %s - %d - %d"), delim, fstr, dstrlen, index);
|
||||||
|
index--;
|
||||||
|
if (!index) {
|
||||||
|
match = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (match == true) {
|
||||||
|
clen = 0;
|
||||||
|
while (glob_script_mem.files[find].available()) {
|
||||||
|
uint8_t buf[1];
|
||||||
|
glob_script_mem.files[find].read(buf, 1);
|
||||||
|
if (buf[0] == delimc) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fstr[clen] = buf[0];
|
||||||
|
clen++;
|
||||||
|
if (clen >= sizeof(fstr)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fstr[clen] = 0;
|
||||||
|
}
|
||||||
|
if (sp) strlcpy(sp, fstr, glob_script_mem.max_ssize);
|
||||||
|
}
|
||||||
|
len = 0;
|
||||||
|
lp++;
|
||||||
|
goto strexit;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // USE_SCRIPT_FATFS_EXT
|
#endif // USE_SCRIPT_FATFS_EXT
|
||||||
if (!strncmp_XP(lp, XPSTR("fl1("), 4) || !strncmp_XP(lp, XPSTR("fl2("), 4) ) {
|
if (!strncmp_XP(lp, XPSTR("fl1("), 4) || !strncmp_XP(lp, XPSTR("fl2("), 4) ) {
|
||||||
uint8_t lknum = *(lp + 2) & 3;
|
uint8_t lknum = *(lp + 2) & 3;
|
||||||
@ -4314,7 +4382,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
|
|||||||
tind->bits.is_string = 0;
|
tind->bits.is_string = 0;
|
||||||
return lp + len;
|
return lp + len;
|
||||||
}
|
}
|
||||||
#ifdef USE_LVGL
|
#ifdef xUSE_LVGL
|
||||||
if (!strncmp_XP(lp, XPSTR("lvgl("), 5)) {
|
if (!strncmp_XP(lp, XPSTR("lvgl("), 5)) {
|
||||||
lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv);
|
lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv);
|
||||||
SCRIPT_SKIP_SPACES
|
SCRIPT_SKIP_SPACES
|
||||||
@ -6436,6 +6504,27 @@ struct T_INDEX ind;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *GetLongIString(char *lp, char **dstr) {
|
||||||
|
while (*lp == ' ') lp++;
|
||||||
|
if (*lp != '"') {
|
||||||
|
*dstr = (char*)malloc(SCRIPT_MAXSSIZE);
|
||||||
|
if (!*dstr) return lp;
|
||||||
|
lp = GetStringArgument(lp, OPER_EQU, *dstr, 0);
|
||||||
|
} else {
|
||||||
|
lp++;
|
||||||
|
char *cp = strchr(lp, '"');
|
||||||
|
if (cp) {
|
||||||
|
uint16_t slen = (uint32_t)cp - (uint32_t)lp;
|
||||||
|
*dstr = (char*)calloc(slen + 2, 1);
|
||||||
|
if (!*dstr) return lp;
|
||||||
|
memmove(*dstr, lp, slen);
|
||||||
|
lp = cp + 1;
|
||||||
|
} else {
|
||||||
|
// error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lp;
|
||||||
|
}
|
||||||
|
|
||||||
char *ForceStringVar(char *lp, char *dstr) {
|
char *ForceStringVar(char *lp, char *dstr) {
|
||||||
TS_FLOAT fvar;
|
TS_FLOAT fvar;
|
||||||
@ -6902,7 +6991,7 @@ void esp_pwm(int32_t value, uint32 freq, uint32_t channel) {
|
|||||||
if (value > 1023) {
|
if (value > 1023) {
|
||||||
value = 1023;
|
value = 1023;
|
||||||
}
|
}
|
||||||
AnalogWrite(pwmpin[channel],value);
|
AnalogWrite(pwmpin[channel], value);
|
||||||
}
|
}
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
}
|
}
|
||||||
@ -12031,6 +12120,7 @@ int32_t url2file(uint8_t fref, char *url) {
|
|||||||
HTTPClient http;
|
HTTPClient http;
|
||||||
int32_t httpCode = 0;
|
int32_t httpCode = 0;
|
||||||
String weburl = "http://"+UrlEncode(url);
|
String weburl = "http://"+UrlEncode(url);
|
||||||
|
|
||||||
for (uint32_t retry = 0; retry < 3; retry++) {
|
for (uint32_t retry = 0; retry < 3; retry++) {
|
||||||
http.begin(http_client, weburl);
|
http.begin(http_client, weburl);
|
||||||
delay(100);
|
delay(100);
|
||||||
@ -12121,7 +12211,7 @@ int32_t http_req(char *host, char *request) {
|
|||||||
|
|
||||||
|
|
||||||
glob_script_mem.glob_error = 0;
|
glob_script_mem.glob_error = 0;
|
||||||
#endif
|
#endif // USE_WEBSEND_RESPONSE
|
||||||
|
|
||||||
http.end();
|
http.end();
|
||||||
http_client.stop();
|
http_client.stop();
|
||||||
@ -12347,7 +12437,7 @@ uint32_t script_i2c(uint8_t sel, uint16_t val, uint32_t val1) {
|
|||||||
#endif // USE_SCRIPT_I2C
|
#endif // USE_SCRIPT_I2C
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_LVGL
|
#ifdef xUSE_LVGL
|
||||||
#include <renderer.h>
|
#include <renderer.h>
|
||||||
#include "lvgl.h"
|
#include "lvgl.h"
|
||||||
|
|
||||||
@ -12761,8 +12851,12 @@ void script_add_subpage(uint8_t num) {
|
|||||||
wptr = ScriptFullWebpage7;
|
wptr = ScriptFullWebpage7;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sprintf_P(id, PSTR("/sfd%1d"), num);
|
uint8_t flag = 1 << num;
|
||||||
Webserver->on(id, wptr);
|
if (!(glob_script_mem.wsp & flag)) {
|
||||||
|
sprintf_P(id, PSTR("/sfd%1d"), num);
|
||||||
|
Webserver->on(id, wptr);
|
||||||
|
glob_script_mem.wsp |= flag;
|
||||||
|
}
|
||||||
WSContentSend_P(HTTP_WEB_FULL_DISPLAY, num, bname);
|
WSContentSend_P(HTTP_WEB_FULL_DISPLAY, num, bname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -12773,8 +12867,6 @@ void script_add_subpage(uint8_t num) {
|
|||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
//const esp_partition_t *esp32_part;
|
//const esp_partition_t *esp32_part;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Xdrv10(uint32_t function)
|
bool Xdrv10(uint32_t function)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user