소스 검색

make sure, when we're checking if we have enough dir info, that
we actually have the descriptor listed in the consensus, not just
any descriptor, for each relay.

don't backport this patch (yet); who knows what it might do.


svn:r14971

Roger Dingledine 17 년 전
부모
커밋
b65b89d50f
1개의 변경된 파일7개의 추가작업 그리고 4개의 파일을 삭제
  1. 7 4
      src/or/routerlist.c

+ 7 - 4
src/or/routerlist.c

@@ -4194,6 +4194,7 @@ update_router_have_minimum_dir_info(void)
   int res;
   or_options_t *options = get_options();
   routerinfo_t *ri;
+  signed_descriptor_t *sd;
   const networkstatus_t *consensus =
     networkstatus_get_reasonably_live_consensus(now);
 
@@ -4220,10 +4221,12 @@ update_router_have_minimum_dir_info(void)
      {
        if (client_would_use_router(rs, now, options)) {
          ++num_usable; /* the consensus says we want it. */
-         /* XXX021 shouldn't we look up by descriptor digest? */
-         ri = router_get_by_digest(rs->identity_digest);
-         if (ri) {
-           ++num_present; /* we have some descriptor for it. */
+         if ((sd = router_get_by_descriptor_digest(rs->descriptor_digest)) &&
+             (ri = router_get_by_digest(rs->identity_digest)) &&
+             !memcmp(ri->cache_info.signed_descriptor_digest,
+                     sd->signed_descriptor_digest, DIGEST_LEN)) {
+           /* we have the descriptor listed in the consensus. */
+           ++num_present;
            if (ri->is_running)
              ++num_running; /* our local status says it's still up. */
          }