Преглед на файлове

authdirservers accept the uploading of unverified descriptors.

fix a bunch of bugs in router_update_status_from_smartlist()
(Nick, did I get them all, or was there a trickier one still hiding?)


svn:r2081
Roger Dingledine преди 21 години
родител
ревизия
ecc9009256
променени са 3 файла, в които са добавени 21 реда и са изтрити 18 реда
  1. 17 15
      src/or/dirserv.c
  2. 3 2
      src/or/routerlist.c
  3. 1 1
      src/or/routerparse.c

+ 17 - 15
src/or/dirserv.c

@@ -283,6 +283,7 @@ dirserv_add_descriptor(const char **desc)
   const char *cp;
   size_t desc_len;
   time_t now;
+  int verified=1; /* whether we knew its fingerprint already */
 
   if (!descriptor_list)
     descriptor_list = smartlist_create();
@@ -311,23 +312,23 @@ dirserv_add_descriptor(const char **desc)
   }
   /* Okay.  Now check whether the fingerprint is recognized. */
   r = dirserv_router_fingerprint_is_known(ri);
-  if(r<1) {
-    if(r==0) {
-      char fp[FINGERPRINT_LEN+1];
-      log_fn(LOG_WARN, "Unknown nickname %s (%s:%d). Not adding.",
-             ri->nickname, ri->address, ri->or_port);
-      if (crypto_pk_get_fingerprint(ri->identity_pkey, fp) < 0) {
-        log_fn(LOG_WARN, "Error computing fingerprint for %s", ri->nickname);
-      } else {
-        log_fn(LOG_WARN, "Fingerprint line: %s %s", ri->nickname, fp);
-      }
-    } else {
-      log_fn(LOG_WARN, "Known nickname %s, wrong fingerprint. Not adding.", ri->nickname);
-    }
+  if(r==-1) {
+    log_fn(LOG_WARN, "Known nickname %s, wrong fingerprint. Not adding.", ri->nickname);
     routerinfo_free(ri);
     *desc = end;
     return 0;
   }
+  if(r==0) {
+    char fp[FINGERPRINT_LEN+1];
+    log_fn(LOG_WARN, "Unknown nickname %s (%s:%d). Adding.",
+           ri->nickname, ri->address, ri->or_port);
+    if (crypto_pk_get_fingerprint(ri->identity_pkey, fp) < 0) {
+      log_fn(LOG_WARN, "Error computing fingerprint for %s", ri->nickname);
+    } else {
+      log_fn(LOG_WARN, "Fingerprint line: %s %s", ri->nickname, fp);
+    }
+    verified = 0;
+  }
   /* Is there too much clock skew? */
   now = time(NULL);
   if (ri->published_on > now+ROUTER_ALLOW_SKEW) {
@@ -378,7 +379,8 @@ dirserv_add_descriptor(const char **desc)
   strncpy(ent->descriptor, start, desc_len);
   ent->descriptor[desc_len] = '\0';
   ent->router = ri;
-  ent->verified = 1; /* XXXX008 support other possibilities. */
+  /* XXX008 is ent->verified useful/used for anything? */
+  ent->verified = verified; /* XXXX008 support other possibilities. */
   smartlist_add(descriptor_list, ent);
 
   *desc = end;
@@ -705,7 +707,7 @@ static int generate_runningrouters(crypto_pk_env_t *private_key)
              "directory-signature %s\n"
              "-----BEGIN SIGNATURE-----\n",
              published, cp, options.Nickname);
-  free(cp);
+  tor_free(cp);
   if (router_get_runningrouters_hash(s,digest)) {
     log_fn(LOG_WARN,"couldn't compute digest");
     return -1;

+ 3 - 2
src/or/routerlist.c

@@ -836,16 +836,17 @@ void router_update_status_from_smartlist(routerinfo_t *router,
           router->status_set_at = list_time;
           router->is_running = 1;
         }
-        router->is_verified = (name[1] != '$');
+        router->is_verified = (name[0] != '$');
         return;
       }
     } else { /* *name == '!' */
+      name++;
       if (router_nickname_matches(router, name)) {
         if (router->status_set_at < list_time) {
           router->status_set_at = list_time;
           router->is_running = 0;
         }
-        router->is_verified = (name[1] != '$');
+        router->is_verified = (name[0] != '$');
         return;
       }
     }

+ 1 - 1
src/or/routerparse.c

@@ -561,7 +561,7 @@ static int check_directory_signature(const char *digest,
 
 /** Given a string *<b>s</b> containing a concatenated sequence of router
  * descriptors, parses them and stores the result in *<b>dest</b>.  If
- * good_nickname_list is provided, then routers are mared as
+ * good_nickname_list is provided, then routers are marked as
  * running/nonrunning and verified/unverified based on their status in the
  * list.  Otherwise, all routers are marked running and verified.  Advances
  * *s to a point immediately following the last router entry.  Returns 0 on