Blob Blame History Raw
From 832609cc5f16a955648880ebc69b8f226f8782bb Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 14 May 2016 19:22:49 +0100
Subject: [PATCH] utils: boot-analysis: Avoid overflow when comparing large
 doubles.

(cherry picked from commit 1f4a0bd90df35df56eb86c2386d801b51828cb22)
---
 utils/boot-analysis/boot-analysis.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/utils/boot-analysis/boot-analysis.c b/utils/boot-analysis/boot-analysis.c
index 3690ed4..d06d9a1 100644
--- a/utils/boot-analysis/boot-analysis.c
+++ b/utils/boot-analysis/boot-analysis.c
@@ -1157,7 +1157,16 @@ compare_activities_pointers_by_mean (const void *av, const void *bv)
 
   assert ((*a)->magic == ACTIVITY_MAGIC);
   assert ((*b)->magic == ACTIVITY_MAGIC);
-  return (*b)->mean - (*a)->mean;
+
+  /* The mean field is a double in nanoseconds.  For the result of the
+   * comparison we want an integer.  If it is larger than around 2^32,
+   * the following will produce an incorrect result.  Therefore we use
+   * this trick.  Note we want to return largest first.
+   */
+  double a_mean = (*a)->mean;
+  double b_mean = (*b)->mean;
+
+  return (b_mean > a_mean) - (b_mean < a_mean);
 }
 
 static void
-- 
2.7.4