fix memory leak in >w x (#20473)

This commit is contained in:
gemu 2024-01-12 10:04:19 +01:00 committed by GitHub
parent b0f4542707
commit fa6d18a505
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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;