]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
In routers_make_ed_keys_unique, break ties for published_on
authorNick Mathewson <nickm@torproject.org>
Tue, 15 Mar 2016 14:34:05 +0000 (10:34 -0400)
committerNick Mathewson <nickm@torproject.org>
Mon, 21 Mar 2016 17:24:09 +0000 (13:24 -0400)
This ensures that if we can't use published_on to decide an ed,rsa
mapping, we at least decide deterministically.

Resolves 17668.T3

src/or/dirserv.c

index ab8ddfe840d00ebf400518abeee7ab0164c20cd9..ae67e8edb77aa3eb029351c0b78fa16fda05ae4b 100644 (file)
@@ -2124,7 +2124,8 @@ get_possible_sybil_list(const smartlist_t *routers)
 }
 
 /** If there are entries in <b>routers</b> with exactly the same ed25519 keys,
- * remove the older one.  May alter the order of the list. */
+ * remove the older one.  If they are exactly the same age, remove the one
+ * with the greater descriptor digest. May alter the order of the list. */
 static void
 routers_make_ed_keys_unique(smartlist_t *routers)
 {
@@ -2139,7 +2140,12 @@ routers_make_ed_keys_unique(smartlist_t *routers)
     if ((ri2 = digest256map_get(by_ed_key, pk))) {
       /* Duplicate; must omit one.  Set the omit_from_vote flag in whichever
        * one has the earlier published_on. */
-      if (ri2->cache_info.published_on < ri->cache_info.published_on) {
+      const time_t ri_pub = ri->cache_info.published_on;
+      const time_t ri2_pub = ri2->cache_info.published_on;
+      if (ri2_pub < ri_pub ||
+          (ri2_pub == ri_pub &&
+           memcmp(ri->cache_info.signed_descriptor_digest,
+                  ri2->cache_info.signed_descriptor_digest,DIGEST_LEN)<0)) {
         digest256map_set(by_ed_key, pk, ri);
         ri2->omit_from_vote = 1;
       } else {