Prevent crash on update value_Str

This commit is contained in:
fvanroie 2020-11-25 13:42:42 +01:00
parent 26708d7dc8
commit 7d841a06e1

View File

@ -125,7 +125,7 @@ static lv_color_t haspPayloadToColor(const char * payload)
/* HEX format #rrggbb or #rrggbbaa */ /* HEX format #rrggbb or #rrggbbaa */
char pattern[4]; char pattern[4];
snprintf_P(pattern, sizeof(pattern), PSTR(" 2x")); // % cannot be escaped, so we build our own pattern snprintf_P(pattern, sizeof(pattern), PSTR(" 2x")); // % cannot be escaped, so we build our own pattern
pattern[0]='%'; pattern[0] = '%';
char buffer[13]; char buffer[13];
snprintf_P(buffer, sizeof(buffer), PSTR("%s%s%s%s"), pattern, pattern, pattern, pattern); snprintf_P(buffer, sizeof(buffer), PSTR("%s%s%s%s"), pattern, pattern, pattern, pattern);
int r, g, b, a; int r, g, b, a;
@ -170,14 +170,27 @@ static lv_font_t * haspPayloadToFont(const char * payload)
return &unscii_8_icon; return &unscii_8_icon;
#if ESP32 #if ESP32
#if LV_FONT_MONTSERRAT_12 > 0
case 12: case 12:
return &lv_font_montserrat_12; return &lv_font_montserrat_12;
#endif
#if LV_FONT_MONTSERRAT_16 > 0
case 16: case 16:
return &lv_font_montserrat_16; return &lv_font_montserrat_16;
#endif
#if LV_FONT_MONTSERRAT_22 > 0
case 22: case 22:
return &lv_font_montserrat_22; return &lv_font_montserrat_22;
#endif
#if LV_FONT_MONTSERRAT_28 > 0
case 28: case 28:
return &lv_font_montserrat_28_compressed; return &lv_font_montserrat_28_compressed;
#endif
#endif #endif
default: default:
@ -536,19 +549,20 @@ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, uint16_t
return attribute_value_opa(obj, part, state, update, attr_p, (lv_opa_t)var); return attribute_value_opa(obj, part, state, update, attr_p, (lv_opa_t)var);
case ATTR_VALUE_STR: { case ATTR_VALUE_STR: {
if(update) { if(update) {
// Free previous string
const char * str = lv_obj_get_style_value_str(obj, part);
lv_obj_set_style_local_value_str(obj, part, state, NULL);
lv_mem_free(str);
// Create new string
size_t len = strlen(payload); size_t len = strlen(payload);
if(len > 0) { if(len > 0) {
// Free previous string
const char * str = lv_obj_get_style_value_str(obj, part);
// Create new string
len++; len++;
char * str_p = (char *)lv_mem_alloc(len); char * str_p = (char *)lv_mem_alloc(len);
memset(str_p, 0, len); memset(str_p, 0, len);
memccpy(str_p, payload, 0, len); memccpy(str_p, payload, 0, len);
lv_obj_set_style_local_value_str(obj, part, state, str_p); lv_obj_set_style_local_value_str(obj, part, state, str_p);
// if(strlen(str) > 0) lv_mem_free(str); // BIG : Memory Leak ! / crashes
} }
} else { } else {
hasp_out_str(obj, attr, lv_obj_get_style_value_str(obj, part)); hasp_out_str(obj, attr, lv_obj_get_style_value_str(obj, part));