Fix memory leak in lis2dw_monitor_face settings array

state->settings was malloc'd in lis2dw_monitor_face_setup() outside
the guard that only runs on first allocation of the face's context.
setup() is called again every time the watch wakes from deep sleep
(movement.c's app_setup() re-runs watch_faces[i].setup() for every
face on wake), so each wake cycle allocated a new settings array and
abandoned the previous pointer with no matching free.

Since NUM_SETTINGS is a compile-time constant, make settings a
fixed-size array embedded directly in lis2dw_monitor_state_t instead
of a separately malloc'd pointer, so it's allocated exactly once
along with the rest of the state and never leaks.
This commit is contained in:
Konrad Rieck
2026-07-27 22:11:52 +02:00
parent b2589bebcd
commit c742e92e7f
2 changed files with 4 additions and 5 deletions
-4
View File
@@ -31,9 +31,6 @@
/* Display frequency */
#define DISPLAY_FREQUENCY 8
/* Settings */
#define NUM_SETTINGS 7
static void _settings_title_display(lis2dw_monitor_state_t *state, char *buf1, char *buf2)
{
char buf[10];
@@ -541,7 +538,6 @@ void lis2dw_monitor_face_setup(uint8_t watch_face_index, void **context_ptr)
/* Initialize settings */
uint8_t settings_page = 0;
state->settings = malloc(NUM_SETTINGS * sizeof(lis2dw_settings_t));
state->settings[settings_page].display = _settings_mode_display;
state->settings[settings_page].advance = _settings_mode_advance;
settings_page++;
+4 -1
View File
@@ -56,13 +56,16 @@ typedef struct {
void (*advance)(void *);
} lis2dw_settings_t;
/* Number of settings pages */
#define NUM_SETTINGS 7
typedef struct {
uint8_t axis:2; /* Axis to display */
lis2dw_reading_t reading; /* Current reading */
lis2dw_monitor_page_t page; /* Displayed page */
lis2dw_device_state_t ds; /* Device state */
uint8_t settings_page:3; /* Subpage in settings */
lis2dw_settings_t *settings; /* Settings config */
lis2dw_settings_t settings[NUM_SETTINGS]; /* Settings config */
uint8_t show_title:6; /* Display face title */
} lis2dw_monitor_state_t;