From 0b7ea662fee0530272a7557e045a5f7643673744 Mon Sep 17 00:00:00 2001 From: Konrad Rieck Date: Mon, 27 Jul 2026 20:40:21 +0200 Subject: [PATCH] Fix day-increment overflow check in deadline_face settings date_time.unit.day is a 5-bit bitfield (max 31). Incrementing 31 directly in the bitfield wrapped to 0 via truncation before the day > days_in_month bounds check ever ran, so the overflow was never caught. The result decoded as "day 0" of the current month, i.e. the last day of the previous month, silently rolling the displayed date backwards (e.g. Aug 31 -> Jul 31 -> Jun 30). Compute the incremented day in a plain uint8_t local first, compare it against the month length, and only then write the final value into the bitfield. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01PSucp94GA31sshe5AjvSzQ --- watch-faces/complication/deadline_face.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/watch-faces/complication/deadline_face.c b/watch-faces/complication/deadline_face.c index f1254c7e..814701a0 100644 --- a/watch-faces/complication/deadline_face.c +++ b/watch-faces/complication/deadline_face.c @@ -237,17 +237,18 @@ static void _increment_date(deadline_state_t *state, watch_date_time_t date_time case 1: date_time.unit.month = (date_time.unit.month % 12) + 1; break; - case 2: - date_time.unit.day = date_time.unit.day + 1; - + case 2: { /* Check for leap years */ - int8_t days = days_in_month[date_time.unit.month - 1]; + uint8_t days = days_in_month[date_time.unit.month - 1]; if (date_time.unit.month == 2 && _is_leap(date_time.unit.year)) days++; - if (date_time.unit.day > days) - date_time.unit.day = 1; + /* Compute next day outside the 5-bit bitfield so overflow past 31 + * can be compared against `days` before it gets truncated. */ + uint8_t day = date_time.unit.day + 1; + date_time.unit.day = (day > days) ? 1 : day; break; + } case 3: date_time.unit.hour = (date_time.unit.hour + 1) % 24; break;