diff options
Diffstat (limited to 'cpukit/score/src/coretodset.c')
-rw-r--r-- | cpukit/score/src/coretodset.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c index ed840ece2b..b9a745d9b4 100644 --- a/cpukit/score/src/coretodset.c +++ b/cpukit/score/src/coretodset.c @@ -22,6 +22,25 @@ #include <rtems/score/assert.h> #include <rtems/score/watchdogimpl.h> +static Status_Control _TOD_Check_time_of_day_and_run_hooks( + const struct timespec *tod +) +{ + if ( !_Watchdog_Is_valid_timespec( tod ) ) { + return STATUS_INVALID_NUMBER; + } + + if ( tod->tv_sec < TOD_SECONDS_1970_THROUGH_1988 ) { + return STATUS_INVALID_NUMBER; + } + + if ( _Watchdog_Is_far_future_timespec( tod ) ) { + return STATUS_INVALID_NUMBER; + } + + return _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod ); +} + Status_Control _TOD_Set( const struct timespec *tod, ISR_lock_Context *lock_context @@ -35,7 +54,7 @@ Status_Control _TOD_Set( _Assert( _TOD_Is_owner() ); - status = _TOD_Hook_Run( TOD_ACTION_SET_CLOCK, tod ); + status = _TOD_Check_time_of_day_and_run_hooks( tod ); if ( status != STATUS_SUCCESSFUL ) { _TOD_Release( lock_context ); return status; |