author Andre Noll Tue, 15 Mar 2016 19:48:12 +0000 (20:48 +0100) committer Andre Noll Tue, 15 Mar 2016 21:03:11 +0000 (22:03 +0100)
The three variables x, s, n are all of unsigned type, and the
subtraction x - s / n may underflow, resulting in a very large positive
value. This should not matter since we square the difference, but on
the other hand, the underflow can easily be avoided. This patch uses
a temporary variable to do so.

 mood.c patch | blob | history

diff --git a/mood.c b/mood.c
index e026c96..415e170 100644 (file)
--- a/mood.c
+++ b/mood.c
@@ -504,7 +504,7 @@ static long compute_dynamic_score(const struct osl_row *aft_row)

static int add_afs_statistics(const struct osl_row *row)
{
-       uint64_t n, x, s;
+       uint64_t n, x, s, q;
struct afs_info afsi;
int ret;

@@ -514,14 +514,18 @@ static int add_afs_statistics(const struct osl_row *row)
n = statistics.num;
x = afsi.last_played;
s = statistics.last_played_sum;
-       if (n > 0)
-               statistics.last_played_qd += (x - s / n) * (x - s / n) * n / (n + 1);
+       if (n > 0) {
+               q = (x > s / n)? x - s / n : s / n - x;
+               statistics.last_played_qd += q * q * n / (n + 1);
+       }
statistics.last_played_sum += x;

x = afsi.num_played;
s = statistics.num_played_sum;
-       if (n > 0)
-               statistics.num_played_qd += (x - s / n) * (x - s / n) * n / (n + 1);
+       if (n > 0) {
+               q = (x > s / n)? x - s / n : s / n - x;
+               statistics.num_played_qd += q * q * n / (n + 1);
+       }
statistics.num_played_sum += x;
statistics.num++;
return 1;