From 821525e5032bf56912ecce5f2aa650c57ea89ea2 Mon Sep 17 00:00:00 2001 From: Mahmoud Al-Qudsi Date: Sat, 30 May 2020 15:59:44 -0500 Subject: [PATCH] Defend against race condition calculating job cpu usage Closes #7066 --- src/builtin_jobs.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/builtin_jobs.cpp b/src/builtin_jobs.cpp index 6b0aa84fb..1dd0a16c2 100644 --- a/src/builtin_jobs.cpp +++ b/src/builtin_jobs.cpp @@ -32,13 +32,18 @@ static int cpu_use(const job_t *j) { for (const process_ptr_t &p : j->processes) { struct timeval t; - int jiffies; + unsigned long jiffies; gettimeofday(&t, nullptr); jiffies = proc_get_jiffies(p.get()); double t1 = 1000000.0 * p->last_time.tv_sec + p->last_time.tv_usec; double t2 = 1000000.0 * t.tv_sec + t.tv_usec; + // Check for a race condition that can cause negative CPU usage to be reported (#7066) + if (t2 < t1 || jiffies < p->last_jiffies) { + continue; + } + // std::fwprintf( stderr, L"t1 %f t2 %f p1 %d p2 %d\n", t1, t2, jiffies, p->last_jiffies ); u += (static_cast(jiffies - p->last_jiffies)) / (t2 - t1); }