mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 06:08:20 +00:00
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
This commit is contained in:
committed by
Sebastian Huber
parent
2a24f99d11
commit
7bbbe4225c
@@ -123,6 +123,22 @@ extern "C" {
|
||||
*/
|
||||
#define TOD_BASE_YEAR 1988
|
||||
|
||||
/**
|
||||
* @brief Latest year to which a time of day can be initialized.
|
||||
*
|
||||
* The following constant defines the latest year to which an
|
||||
* RTEMS time of day can be set using rtems_clock_set().
|
||||
*
|
||||
* 32 bits can accept as latest point in time 2106-Feb-7 6:28:15
|
||||
* but to simplify the implementation, is was decided to only
|
||||
* check that the year is not greater than the year of this constant.
|
||||
*
|
||||
* The internal realtime clock can run centuries longer but in
|
||||
* contrast to the POSIX API, the RTEMS Classic API does not
|
||||
* support this for efficiency reasons.
|
||||
*/
|
||||
#define TOD_LATEST_YEAR 2105
|
||||
|
||||
/**
|
||||
* @addtogroup RTEMSScoreTOD
|
||||
*
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <rtems/rtems/clockimpl.h>
|
||||
#include <rtems/score/todimpl.h>
|
||||
|
||||
#define TOD_SECONDS_AT_2100_03_01_00_00 4107538800UL
|
||||
#define TOD_SECONDS_AT_2100_03_01_00_00 4107542400UL
|
||||
|
||||
/*
|
||||
* The following array contains the number of days in all months
|
||||
|
||||
@@ -52,6 +52,7 @@ bool _TOD_Validate(
|
||||
(the_tod->month == 0) ||
|
||||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
|
||||
(the_tod->year < TOD_BASE_YEAR) ||
|
||||
(the_tod->year > TOD_LATEST_YEAR) ||
|
||||
(the_tod->day == 0) )
|
||||
return false;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user