From f36dd66a0577e9f70d5ac3ad8a325f5771a9ae5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 8 Feb 2024 22:05:57 +0100 Subject: [PATCH] Fix memory corruption with memcpy(), support musl libc --- src/hasp/hasp_dispatch.cpp | 2 +- src/hasp/hasp_event.cpp | 22 +++++++++++++--------- src/hasp/hasp_parser.cpp | 22 +++++++++++----------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 1124a76d..0b58089f 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -1360,7 +1360,7 @@ void dispatch_idle_state(uint8_t state) { char topic[8]; char buffer[8]; - memcpy_P(topic, PSTR("idle"), 8); + memcpy_P(topic, PSTR("idle"), 5); hasp_get_sleep_payload(state, buffer); dispatch_state_subtopic(topic, buffer); } diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index 433bc7ea..fd5eeaee 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -176,9 +176,9 @@ void event_timer_clock(lv_task_t* task) timeval curTime; int rslt = gettimeofday(&curTime, NULL); (void)rslt; // unused - time_t seconds = curTime.tv_sec; - useconds_t tv_msec = curTime.tv_usec / 1000; - tm* timeinfo = localtime(&seconds); + time_t seconds = curTime.tv_sec; + auto tv_msec = curTime.tv_usec / 1000; + tm* timeinfo = localtime(&seconds); lv_task_set_period(task, data->interval - tv_msec); char buffer[128] = {0}; @@ -835,7 +835,7 @@ void cpicker_event_handler(lv_obj_t* obj, lv_event_t event) if(!translate_event(obj, event, hasp_event_id) || event == LV_EVENT_VALUE_CHANGED) return; /* Get the new value */ - lv_color_t color = lv_cpicker_get_color(obj); + lv_color_t color = lv_cpicker_get_color(obj); lv_cpicker_color_mode_t mode = lv_cpicker_get_color_mode(obj); if(hasp_event_id == HASP_EVENT_CHANGED && last_color_sent.full == color.full) return; // same value as before @@ -853,12 +853,16 @@ void cpicker_event_handler(lv_obj_t* obj, lv_event_t event) if(const char* tag = my_obj_get_tag(obj)) snprintf_P(data, sizeof(data), - PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"h\":%d,\"s\":%d,\"v\":%d,\"tag\":%s}"), - eventname, c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, hsv.h, hsv.s, hsv.v, tag); + PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"h\":%d,\"s\":%" + "d,\"v\":%d,\"tag\":%s}"), + eventname, c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, hsv.h, + hsv.s, hsv.v, tag); else snprintf_P(data, sizeof(data), - PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"h\":%d,\"s\":%d,\"v\":%d}"), eventname, - c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, hsv.h, hsv.s, hsv.v); + PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"h\":%d,\"s\":%" + "d,\"v\":%d}"), + eventname, c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, hsv.h, + hsv.s, hsv.v); } event_send_object_data(obj, data); @@ -907,4 +911,4 @@ void calendar_event_handler(lv_obj_t* obj, lv_event_t event) // event_update_group(obj->user_data.groupid, obj, val, min, max); } -#endif \ No newline at end of file +#endif diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index 0b85e415..8660060c 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -136,34 +136,34 @@ void Parser::get_event_name(uint8_t eventid, char* buffer, size_t size) { switch(eventid) { case HASP_EVENT_ON: - memcpy_P(buffer, PSTR("on"), size); + memcpy_P(buffer, PSTR("on"), 3); break; case HASP_EVENT_OFF: - memcpy_P(buffer, PSTR("off"), size); + memcpy_P(buffer, PSTR("off"), 4); break; case HASP_EVENT_UP: - memcpy_P(buffer, PSTR("up"), size); + memcpy_P(buffer, PSTR("up"), 3); break; case HASP_EVENT_DOWN: - memcpy_P(buffer, PSTR("down"), size); + memcpy_P(buffer, PSTR("down"), 5); break; case HASP_EVENT_RELEASE: - memcpy_P(buffer, PSTR("release"), size); + memcpy_P(buffer, PSTR("release"), 8); break; case HASP_EVENT_LONG: - memcpy_P(buffer, PSTR("long"), size); + memcpy_P(buffer, PSTR("long"), 5); break; case HASP_EVENT_HOLD: - memcpy_P(buffer, PSTR("hold"), size); + memcpy_P(buffer, PSTR("hold"), 5); break; case HASP_EVENT_LOST: - memcpy_P(buffer, PSTR("lost"), size); + memcpy_P(buffer, PSTR("lost"), 5); break; case HASP_EVENT_CHANGED: - memcpy_P(buffer, PSTR("changed"), size); + memcpy_P(buffer, PSTR("changed"), 8); break; default: - memcpy_P(buffer, PSTR("unknown"), size); + memcpy_P(buffer, PSTR("unknown"), 8); } } @@ -238,4 +238,4 @@ long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } -#endif \ No newline at end of file +#endif