diff options
author | teor <teor2345@gmail.com> | 2014-09-29 20:24:40 +1000 |
---|---|---|
committer | teor <teor2345@gmail.com> | 2014-09-29 20:49:24 +1000 |
commit | 4d0ad34a92dff2be0b23e75ca5373054a5c9334a (patch) | |
tree | b3e3c327faad7cf8e90a8b985878b49229a8f78e /src/or/circuitstats.c | |
parent | ffd92e8ef885f4a63fd09892d508674c9b4a1daf (diff) | |
download | tor-4d0ad34a92dff2be0b23e75ca5373054a5c9334a.tar.gz tor-4d0ad34a92dff2be0b23e75ca5373054a5c9334a.zip |
Avoid division by zero in circuitstats pareto
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.
Diffstat (limited to 'src/or/circuitstats.c')
-rw-r--r-- | src/or/circuitstats.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index c24259c22c..5336e4046e 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -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; } |