From 21626d1ac5e9727e216e93ab411e66052a5a1840 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Tue, 25 Nov 2025 21:02:04 -0600 Subject: [PATCH] Fixed datetime integer overflow on 8-bit compiler (#1162) --- CHANGELOG.md | 1 + src/bacnet/datetime.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f6427e1..1e3180a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ The git repositories are hosted at the following sites: ### Fixed +* Fixed datetime integer overflow on 8-bit AVR compiler (#1162) * Fixed the ports/linux BACnet/IP cache netmask for accurate subnet prefix calculation implementation which had always returned 0. (#1155) * Fixed the loop object empty reference property by initializing to self. diff --git a/src/bacnet/datetime.c b/src/bacnet/datetime.c index 88dbb9a9..ea4ef8a1 100644 --- a/src/bacnet/datetime.c +++ b/src/bacnet/datetime.c @@ -725,29 +725,29 @@ void datetime_add_seconds(BACNET_DATE_TIME *bdatetime, int32_t seconds) bdatetime->time.hour, bdatetime->time.min, bdatetime->time.sec); bdatetime_days = datetime_days_since_epoch(&bdatetime->date); /* more minutes than in a day? */ - days = seconds / (24 * 60 * 60); + days = seconds / (24L * 60L * 60L); bdatetime_days += days; - seconds -= (days * 24 * 60 * 60); + seconds -= (days * 24L * 60L * 60L); /* less seconds - previous day? */ if (seconds < 0) { /* convert to positive for easier math */ - seconds *= -1; + seconds *= -1L; if ((uint32_t)seconds > bdatetime_seconds) { /* previous day */ - bdatetime_days -= 1; - bdatetime_seconds += ((24 * 60 * 60) - seconds); + bdatetime_days -= 1L; + bdatetime_seconds += ((24L * 60L * 60L) - seconds); } else { bdatetime_seconds -= seconds; - days = bdatetime_seconds / (24 * 60 * 60); + days = bdatetime_seconds / (24L * 60L * 60L); bdatetime_days += days; - bdatetime_seconds -= (days * 24 * 60 * 60); + bdatetime_seconds -= (days * 24L * 60L * 60L); } } else { /* more days than current datetime? */ bdatetime_seconds += seconds; - days = bdatetime_seconds / (24 * 60 * 60); + days = bdatetime_seconds / (24L * 60L * 60L); bdatetime_days += days; - bdatetime_seconds -= (days * 24 * 60 * 60); + bdatetime_seconds -= (days * 24L * 60L * 60L); } /* convert bdatetime from seconds and days */ datetime_hms_from_seconds_since_midnight(