From d392ddf243dcbf8a34726c777d2c669b1e8bfa85 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Thu, 2 Nov 2023 15:34:13 +0100 Subject: meta: fix hour decoding when timezone offset is negative Brian Davidson says: meta hour rules don't display properly after being created when the hour is on or after 00:00 UTC. The netlink debug looks correct for seconds past midnight UTC, but displaying the rules looks like an overflow or a byte order problem. I am in UTC-0400, so today, 20:00 and later exhibits the problem, while 19:00 and earlier hours are fine. meta.c only ever worked when the delta to UTC is positive. We need to add in case the second counter turns negative after offset adjustment. Also add a test case for this. Fixes: f8f32deda31d ("meta: Introduce new conditions 'time', 'day' and 'hour'") Reported-by: Brian Davidson Signed-off-by: Florian Westphal --- src/meta.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/meta.c b/src/meta.c index b578d5e2..7846aefe 100644 --- a/src/meta.c +++ b/src/meta.c @@ -495,9 +495,16 @@ static void hour_type_print(const struct expr *expr, struct output_ctx *octx) /* Obtain current tm, so that we can add tm_gmtoff */ ts = time(NULL); - if (ts != ((time_t) -1) && localtime_r(&ts, &cur_tm)) - seconds = (seconds + cur_tm.tm_gmtoff) % SECONDS_PER_DAY; + if (ts != ((time_t) -1) && localtime_r(&ts, &cur_tm)) { + int32_t adj = seconds + cur_tm.tm_gmtoff; + if (adj < 0) + adj += SECONDS_PER_DAY; + else if (adj >= SECONDS_PER_DAY) + adj -= SECONDS_PER_DAY; + + seconds = adj; + } minutes = seconds / 60; seconds %= 60; hours = minutes / 60; -- cgit v1.2.3