summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Palfrader <peter@palfrader.org>2006-02-14 00:08:19 +0000
committerPeter Palfrader <peter@palfrader.org>2006-02-14 00:08:19 +0000
commit761da5b97feb333f3f0d6f6565256644f92a0ae3 (patch)
tree9656657fa4624fd009ac42d4146c9f63aa379abe
parentcfcb1b1afd28c81cc4d993c9e34a9ca1f1da628d (diff)
downloadtor-761da5b97feb333f3f0d6f6565256644f92a0ae3.tar.gz
tor-761da5b97feb333f3f0d6f6565256644f92a0ae3.zip
Our connection_or_get_by_identity_digest() was slightly wrong. If best
didn't have any circuits on it, but conn had circuits, we would not make conn our new best unless it was also newer. Also, restructure the code a bit to maybe make it clearer. svn:r6012
-rw-r--r--src/or/connection_or.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 07b43dfbc1..54eb78bd6d 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -394,12 +394,22 @@ connection_or_get_by_identity_digest(const char *digest)
conn->state != OR_CONN_STATE_OPEN)
continue; /* avoid non-open conns if we can */
newer = best->timestamp_created < conn->timestamp_created;
- if (conn->is_obsolete && (!best->is_obsolete || !newer))
- continue; /* we have something, and it's better than this. */
- if (best->n_circuits && !conn->n_circuits)
- continue; /* prefer conns with circuits on them */
- if (newer)
- best = conn; /* lastly, prefer newer conns */
+
+ if (!best->is_obsolete && conn->is_obsolete)
+ continue; /* We never prefer obsolete over non-obsolete connections. */
+
+ /* If both are obsolete we prefer the newer: */
+ if ((best->is_obsolete && conn->is_obsolete && newer) ||
+ /* We prefer non-obsolete connections */
+ (best->is_obsolete && !conn->is_obsolete) ||
+ /* If both have circuits we prefer the newer: */
+ (best->n_circuits && conn->n_circuits && newer) ||
+ /* If neither has circuits we prefer the newer: */
+ (!best->n_circuits && !conn->n_circuits && newer) ||
+ /* We prefer connections with circuits: */
+ (!best->n_circuits && conn->n_circuits)) {
+ best = conn;
+ };
}
return best;
}