Browse Source

Clean up last patch; implement (mostly) proper handling for verified/unverified name collisions.

svn:r2248
Nick Mathewson 21 years ago
parent
commit
590cd621f8
3 changed files with 18 additions and 2 deletions
  1. 1 1
      src/or/or.h
  2. 17 0
      src/or/routerlist.c
  3. 0 1
      src/or/routerparse.c

+ 1 - 1
src/or/or.h

@@ -588,7 +588,7 @@ typedef struct {
   uint32_t bandwidthcapacity;
   struct exit_policy_t *exit_policy; /**< What streams will this OR permit
                                       * to exit? */
-  int uptime; /**< How many seconds the router claims to have been up */
+  long uptime; /**< How many seconds the router claims to have been up */
   /* local info */
   int is_running; /**< As far as we know, is this OR currently running? */
   time_t status_set_at; /**< When did we last update is_running? */

+ 17 - 0
src/or/routerlist.c

@@ -565,6 +565,23 @@ int router_add_to_routerlist(routerinfo_t *router) {
         routerinfo_free(router);
         return -1;
       }
+    } else if (!strcmp(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
+         * there are more old unverifed routers with this nickname
+         */
+        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'",
+               router->nickname);
+        routerinfo_free(router);
+        return -1;
+      }
     }
   }
   /* We haven't seen a router with this name before.  Add it to the end of

+ 0 - 1
src/or/routerparse.c

@@ -644,7 +644,6 @@ routerinfo_t *router_parse_entry_from_string(const char *s,
   smartlist_t *tokens = NULL, *exit_policy_tokens = NULL;
   directory_token_t *tok;
   int t;
-  long lng;
   int ports_set, bw_set;
 
   if (!end) {