[rtems commit] Fix integer overflow problems in times()
Sebastian Huber
sebh at rtems.org
Wed Sep 6 05:43:44 UTC 2017
Module: rtems
Branch: master
Commit: 731e68a39a7b8d662df74d75d780c1ad2c2f8729
Changeset: http://git.rtems.org/rtems/commit/?id=731e68a39a7b8d662df74d75d780c1ad2c2f8729
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Fri Aug 25 15:22:37 2017 +0200
Fix integer overflow problems in times()
An integer overflow may still happen, however, only after 68 years of
system uptime.
Close #2135.
---
cpukit/libcsupport/src/__times.c | 50 +++++++++++++---------------------------
1 file changed, 16 insertions(+), 34 deletions(-)
diff --git a/cpukit/libcsupport/src/__times.c b/cpukit/libcsupport/src/__times.c
index a30f720..0aa7f26 100644
--- a/cpukit/libcsupport/src/__times.c
+++ b/cpukit/libcsupport/src/__times.c
@@ -43,19 +43,23 @@ clock_t _times(
struct tms *ptms
)
{
- rtems_interval ticks, us_per_tick;
+ uint32_t tick_interval;
+ struct bintime binuptime;
+ sbintime_t uptime;
+ struct bintime bin_cpu_time_used;
+ sbintime_t cpu_time_used;
if ( !ptms )
rtems_set_errno_and_return_minus_one( EFAULT );
- memset( ptms, 0, sizeof( *ptms ) );
+ tick_interval = (uint32_t)
+ (SBT_1US * rtems_configuration_get_microseconds_per_tick());
- /*
- * This call does not depend on TOD being initialized and can't fail.
- */
+ ptms = memset( ptms, 0, sizeof( *ptms ) );
- ticks = rtems_clock_get_ticks_since_boot();
- us_per_tick = rtems_configuration_get_microseconds_per_tick();
+ _TOD_Get_zero_based_uptime( &binuptime );
+ uptime = bttosbt( binuptime );
+ ptms->tms_stime = ((clock_t) uptime) / tick_interval;
/*
* RTEMS technically has no notion of system versus user time
@@ -64,33 +68,11 @@ clock_t _times(
* of ticks since boot and the number of ticks executed by this
* this thread.
*/
- {
- Timestamp_Control cpu_time_used;
- Timestamp_Control per_tick;
- uint32_t ticks_of_executing;
- uint32_t fractional_ticks;
-
- _Thread_Get_CPU_time_used( _Thread_Get_executing(), &cpu_time_used );
- _Timestamp_Set(
- &per_tick,
- rtems_configuration_get_microseconds_per_tick() /
- TOD_MICROSECONDS_PER_SECOND,
- (rtems_configuration_get_nanoseconds_per_tick() %
- TOD_NANOSECONDS_PER_SECOND)
- );
- _Timestamp_Divide(
- &cpu_time_used,
- &per_tick,
- &ticks_of_executing,
- &fractional_ticks
- );
-
- ptms->tms_utime = ticks_of_executing * us_per_tick;
- }
-
- ptms->tms_stime = ticks * us_per_tick;
-
- return ticks * us_per_tick;
+ _Thread_Get_CPU_time_used( _Thread_Get_executing(), &bin_cpu_time_used );
+ cpu_time_used = bttosbt( bin_cpu_time_used );
+ ptms->tms_utime = ((clock_t) cpu_time_used) / tick_interval;
+
+ return ptms->tms_stime;
}
/**
More information about the vc
mailing list