|
@@ -2382,9 +2382,14 @@ compute_frac_paths_available(const networkstatus_t *consensus,
|
|
|
f_exit = f_myexit;
|
|
|
}
|
|
|
|
|
|
- /* if the consensus has no exits, treat the exit fraction as 100% */
|
|
|
+ /* if the consensus has no exits, we can only build onion service paths,
|
|
|
+ * which are G - M - M. So use the middle fraction for the exit fraction. */
|
|
|
if (router_have_consensus_path() != CONSENSUS_PATH_EXIT) {
|
|
|
- f_exit = 1.0;
|
|
|
+ /* If there are no exits in the consensus, then f_exit is always 0, so
|
|
|
+ * it is safe to replace f_exit with f_mid. */
|
|
|
+ if (!BUG(f_exit > 0.0)) {
|
|
|
+ f_exit = f_mid;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
f_path = f_guard * f_mid * f_exit;
|
|
@@ -2400,7 +2405,7 @@ compute_frac_paths_available(const networkstatus_t *consensus,
|
|
|
(int)(f_exit*100),
|
|
|
(router_have_consensus_path() == CONSENSUS_PATH_EXIT ?
|
|
|
"exit bw" :
|
|
|
- "end bw (no exits in consensus)"),
|
|
|
+ "end bw (no exits in consensus, using mid)"),
|
|
|
(int)(f_path*100));
|
|
|
|
|
|
return f_path;
|