Browse Source

r13325@catbus: nickm | 2007-06-08 15:02:37 -0400
Parse networkstatuses (v2, vote, and consensus) after generating them, and fail fast if there is a parse error.


svn:r10540

Nick Mathewson 18 years ago
parent
commit
1d6db7ec3d
3 changed files with 34 additions and 1 deletions
  1. 4 0
      ChangeLog
  2. 19 1
      src/or/dirserv.c
  3. 11 0
      src/or/dirvote.c

+ 4 - 0
ChangeLog

@@ -6,6 +6,10 @@ Changes in version 0.2.0.3-alpha - 2007-??-??
     - tor-gencert creates all files as readable to the file creator only, and
       write-protects the authority identity key.
 
+  o Minor features (directory authority):
+    - Fail quickly and (relatively) harmlessly if we generate a network
+      status document that is somehow malformed.
+
   o Deprecated features:
     - RedirectExits is now deprecated.
 

+ 19 - 1
src/or/dirserv.c

@@ -1983,10 +1983,19 @@ format_networkstatus_vote(crypto_pk_env_t *private_key,
 
   note_crypto_pk_op(SIGN_DIR);
   if (router_append_dirobj_signature(outp,endp-outp,digest,private_key)<0) {
-    log_warn(LD_BUG, "Unable to sign router status.");
+    log_warn(LD_BUG, "Unable to sign networkstatus vote.");
     goto err;
   }
 
+  {
+    networkstatus_vote_t *v;
+    if (!(v = networkstatus_parse_vote_from_string(status, 1))) {
+      log_err(LD_BUG,"Generated a networkstatus vote we couldn't parse.");
+      goto err;
+    }
+    networkstatus_vote_free(v);
+  }
+
   goto done;
 
  err:
@@ -2195,6 +2204,15 @@ generate_networkstatus_opinion(int v2)
     goto done;
   }
 
+  {
+    networkstatus_t *ns;
+    if (!(ns = networkstatus_parse_from_string(status))) {
+      log_err(LD_BUG,"Generated a networkstatus we couldn't parse.");
+      goto done;
+    }
+    networkstatus_free(ns);
+  }
+
   {
     cached_dir_t **ns_ptr = &the_v2_networkstatus;
     if (*ns_ptr)

+ 11 - 0
src/or/dirvote.c

@@ -623,6 +623,17 @@ networkstatus_compute_consensus(smartlist_t *votes,
   SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
   smartlist_free(chunks);
 
+  {
+    networkstatus_vote_t *c;
+    if (!(c = networkstatus_parse_vote_from_string(result, 0))) {
+      log_err(LD_BUG,"Generated a networkstatus consensus we couldn't "
+              "parse.");
+      tor_free(result);
+      return NULL;
+    }
+    networkstatus_vote_free(c);
+  }
+
   return result;
 }