浏览代码

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

Peter Palfrader 20 年之前
父节点
当前提交
761da5b97f
共有 1 个文件被更改,包括 16 次插入6 次删除
  1. 16 6
      src/or/connection_or.c

+ 16 - 6
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;
 }