diff options
author | Patrick Marlier <patrick.marlier@gmail.com> | 2015-08-30 21:26:47 +0200 |
---|---|---|
committer | Patrick Marlier <patrick.marlier@gmail.com> | 2015-09-14 22:51:14 +0200 |
commit | b37d4f172f048a67cbc3cb6bbef00b67212ddb88 (patch) | |
tree | dbb16aa1acf0a3e3b63ff8d8e10ec349003798bc /linux | |
parent | 1d805b36b429f5157dd0de6f0b498941aa097941 (diff) |
Fix a case where the usertime calculation can overflow (see issue #202)
Diffstat (limited to 'linux')
-rw-r--r-- | linux/LinuxProcessList.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 46902aff..92259514 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -695,8 +695,6 @@ static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) { unsigned long long int virtalltime = guest + guestnice; unsigned long long int totaltime = usertime + nicetime + systemalltime + idlealltime + steal + virtalltime; CPUData* cpuData = &(this->cpus[i]); - assert (usertime >= cpuData->userTime); - assert (nicetime >= cpuData->niceTime); assert (systemtime >= cpuData->systemTime); assert (idletime >= cpuData->idleTime); assert (totaltime >= cpuData->totalTime); @@ -707,8 +705,11 @@ static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) { assert (softIrq >= cpuData->softIrqTime); assert (steal >= cpuData->stealTime); assert (virtalltime >= cpuData->guestTime); - cpuData->userPeriod = usertime - cpuData->userTime; - cpuData->nicePeriod = nicetime - cpuData->niceTime; + // Since we do a subtraction (usertime - guest) and cputime64_to_clock_t() + // used in /proc/stat rounds down numbers, it can lead to a case where the + // integer overflow. + cpuData->userPeriod = (usertime > cpuData->userTime) ? usertime - cpuData->userTime : 0; + cpuData->nicePeriod = (nicetime > cpuData->niceTime) ? nicetime - cpuData->niceTime : 0; cpuData->systemPeriod = systemtime - cpuData->systemTime; cpuData->systemAllPeriod = systemalltime - cpuData->systemAllTime; cpuData->idleAllPeriod = idlealltime - cpuData->idleAllTime; @@ -732,7 +733,8 @@ static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) { cpuData->guestTime = virtalltime; cpuData->totalTime = totaltime; } - double period = (double)this->cpus[0].totalPeriod / cpus; fclose(file); + double period = (double)this->cpus[0].totalPeriod / cpus; + fclose(file); return period; } |