Browse Source

when a verified routerinfo arrives with a new key than the previous
verified routerinfo with that name, close connections to the obsolete
key to make way for connections to the new key.


svn:r2257

Roger Dingledine 21 years ago
parent
commit
aa1e518446
1 changed files with 11 additions and 3 deletions
  1. 11 3
      src/or/routerlist.c

+ 11 - 3
src/or/routerlist.c

@@ -566,16 +566,24 @@ int router_add_to_routerlist(routerinfo_t *router) {
         routerinfo_free(router);
         return -1;
       }
-    } else if (!strcmp(router->nickname, r->nickname)) {
+    } else if (!strcasecmp(router->nickname, r->nickname)) {
       /* nicknames match, keys don't. */
       if (router->is_verified) {
         /* The new verified router replaces the old one; remove the
-         * old one.  and carry on to the end of the list, in case
+         * old one.  And carry on to the end of the list, in case
          * there are more old unverifed routers with this nickname
          */
+        /* mark-for-close connections using the old key, so we can
+         * make new ones with the new key.
+         */
+        connection_t *conn;
+        while((conn = connection_get_by_identity_digest(r->identity_digest,
+                                                        CONN_TYPE_OR))) {
+          log_fn(LOG_INFO,"Closing conn to obsolete router '%s'", r->nickname);
+          connection_mark_for_close(conn);
+        }
         routerinfo_free(r);
         smartlist_del_keeporder(routerlist->routers, i--);
-        /* XXXX What do we do about any connections using the old key? */
       } else if (r->is_verified) {
         /* Can't replace a verified router with an unverified one. */
         log_fn(LOG_DEBUG, "Skipping unverified entry for verified router '%s'",