]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Avoid division by zero in circuitstats pareto
authorteor <teor2345@gmail.com>
Mon, 29 Sep 2014 10:24:40 +0000 (20:24 +1000)
committerteor <teor2345@gmail.com>
Mon, 29 Sep 2014 10:49:24 +0000 (20:49 +1000)
In circuit_build_times_calculate_timeout() in circuitstats.c, avoid dividing
by zero in the pareto calculations.

If either the alpha or p parameters are 0, we would divide by zero, yielding
an infinite result; which would be clamped to INT32_MAX anyway. So rather
than dividing by zero, we just skip the offending calculation(s), and
use INT32_MAX for the result.

Division by zero traps under clang -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error.

changes/bug13290-avoid-div-zero-circuitstatus-pareto [new file with mode: 0644]
src/or/circuitstats.c

diff --git a/changes/bug13290-avoid-div-zero-circuitstatus-pareto b/changes/bug13290-avoid-div-zero-circuitstatus-pareto
new file mode 100644 (file)
index 0000000..42b121f
--- /dev/null
@@ -0,0 +1,5 @@
+  o Minor bugfixes:
+    - In circuit_build_times_calculate_timeout() in circuitstats.c, avoid
+      dividing by zero in the pareto calculations. This traps under
+      clang -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error.
+      Fixes bug 13290.
index c24259c22c619e1e9a038ac4ba383aa23e57ae3d..5336e4046e0ebe818f8ee41758bbbe92d7f80406 100644 (file)
@@ -1085,7 +1085,21 @@ circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
   tor_assert(1.0-quantile > 0);
   tor_assert(cbt->Xm > 0);
 
-  ret = cbt->Xm/pow(1.0-quantile,1.0/cbt->alpha);
+  /* If either alpha or p are 0, we would divide by zero, yielding an
+   * infinite (double) result; which would be clamped to INT32_MAX.
+   * Instead, initialise ret to INT32_MAX, and skip over these
+   * potentially illegal/trapping divides by zero.
+   */
+  ret = INT32_MAX;
+
+  if (cbt->alpha > 0) {
+    double p;
+    p = pow(1.0-quantile,1.0/cbt->alpha);
+    if (p > 0) {
+      ret = cbt->Xm/p;
+    }
+  }
+
   if (ret > INT32_MAX) {
     ret = INT32_MAX;
   }