diff options
author | Frank Kühndel <frank.kuehndel@embedded-brains.de> | 2021-04-08 15:41:15 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-04-21 07:13:31 +0200 |
commit | 7bbbe4225c92b646faa14e5f5800ed2feba09899 (patch) | |
tree | ece4e7cd78885c29207ce0b2c50ea537af65bc86 /testsuites/sptests/sp2038 | |
parent | bsps/arm: Set MSP in ARMv7-M start code (diff) | |
download | rtems-7bbbe4225c92b646faa14e5f5800ed2feba09899.tar.bz2 |
clock:_TOD_To_seconds(): Fix year 2514 overflow
This patch fixes issue #4338 by changing _TOD_Validate()
to only accept years till 2105. This requires another patch
to change the documentation of rtems_clock_set() and other
affected API functions (indicating the end date is 2105 not 2514).
I tried to support till year 2514 but it turned out that
this needs changing the Timer Manager too. That in turn
would mean to change _TOD_Seconds_since_epoch( void )
from 32 to 64 bit. Sebastian pointed out that a naive extension
leads to trouble with 32 bit processors. He deemed a safe
re-implementation too costly performance wise considering
that year 2106 is far away and current binaries using RTEMS
Classic API are unlikely to be in use by 2106.
The constant TOD_SECONDS_AT_2100_03_01_00_00 in
cpukit/rtems/src/clocktodtoseconds.c happens to be wrong by
1 hour. When setting the date 2100-Feb-28 23:59:59 and then
reading the date again you will find yourself in 2100-Feb-27.
Update #4338
Diffstat (limited to 'testsuites/sptests/sp2038')
-rw-r--r-- | testsuites/sptests/sp2038/init.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/testsuites/sptests/sp2038/init.c b/testsuites/sptests/sp2038/init.c index a3f09d4156..10850d9c4d 100644 --- a/testsuites/sptests/sp2038/init.c +++ b/testsuites/sptests/sp2038/init.c @@ -149,8 +149,7 @@ static const uint32_t sample_seconds [] = { 4168736895UL, 4200272895UL, 4231808895UL, - 4263431295UL, - 4294967295UL + 4263431295UL }; static const rtems_time_of_day nearly_problem_2038 = { @@ -171,8 +170,8 @@ static const rtems_time_of_day problem_2038 = { .second = 8 }; -static const rtems_time_of_day nearly_problem_2106 = { - .year = 2106, +static const rtems_time_of_day tod_to_seconds_base = { + .year = 0, .month = 2, .day = 7, .hour = 6, @@ -180,13 +179,22 @@ static const rtems_time_of_day nearly_problem_2106 = { .second = 15 }; +static const rtems_time_of_day nearly_problem_2106 = { + .year = 2105, + .month = 12, + .day = 31, + .hour = 23, + .minute = 59, + .second = 59 +}; + static const rtems_time_of_day problem_2106 = { .year = 2106, - .month = 2, - .day = 7, - .hour = 6, - .minute = 28, - .second = 16 + .month = 1, + .day = 1, + .hour = 0, + .minute = 0, + .second = 0 }; static const rtems_time_of_day problem_2100 = { @@ -214,7 +222,7 @@ static void test_tod_to_seconds(void) size_t n = sizeof(sample_seconds) / sizeof(sample_seconds [0]); for (i = 0; i < n; ++i) { - rtems_time_of_day tod = nearly_problem_2106; + rtems_time_of_day tod = tod_to_seconds_base; uint32_t seconds = 0; rtems_interval seconds_as_interval = 0; |