Don't include a router in an md consensus if we can't find a md for it.

The spec requires that every router in a microdesc consensus have an
m line; we weren't obeying that spec.

This creates a new consensus method (13) to allow voting to continue
to work right. Partial fix for bug 6404; fix on 0.2.2.6-alpha.
This commit is contained in:
Nick Mathewson 2012-07-31 10:54:14 -04:00
parent 2503cfad24
commit 7143d112a6
2 changed files with 17 additions and 1 deletions

View File

@ -5,3 +5,8 @@
with complex policies or family declarations. Partial fix for with complex policies or family declarations. Partial fix for
bug 6404; fix on 0.2.2.6-alpha. bug 6404; fix on 0.2.2.6-alpha.
- Authorities no longer include any router in their
microdescriptor consensuses for which they couldn't generate or
agree on a microdescriptor. Partial fix for bug 6404; fix on
0.2.2.6-alpha.

View File

@ -54,7 +54,7 @@ static int dirvote_publish_consensus(void);
static char *make_consensus_method_list(int low, int high, const char *sep); static char *make_consensus_method_list(int low, int high, const char *sep);
/** The highest consensus method that we currently support. */ /** The highest consensus method that we currently support. */
#define MAX_SUPPORTED_CONSENSUS_METHOD 12 #define MAX_SUPPORTED_CONSENSUS_METHOD 13
/** Lowest consensus method that contains a 'directory-footer' marker */ /** Lowest consensus method that contains a 'directory-footer' marker */
#define MIN_METHOD_FOR_FOOTER 9 #define MIN_METHOD_FOR_FOOTER 9
@ -72,6 +72,10 @@ static char *make_consensus_method_list(int low, int high, const char *sep);
* for a param. */ * for a param. */
#define MIN_METHOD_FOR_MAJORITY_PARAMS 12 #define MIN_METHOD_FOR_MAJORITY_PARAMS 12
/** Lowest consensus method where microdesc consensuses omit any entry
* with no microdesc. */
#define MIN_METHOD_FOR_MANDATORY_MICRODESC 13
/* ===== /* =====
* Voting * Voting
* =====*/ * =====*/
@ -1935,6 +1939,13 @@ networkstatus_compute_consensus(smartlist_t *votes,
} }
} }
if (flavor == FLAV_MICRODESC &&
consensus_method >= MIN_METHOD_FOR_MANDATORY_MICRODESC &&
tor_digest256_is_zero(microdesc_digest)) {
/* With no microdescriptor digest, we omit the entry entirely. */
continue;
}
{ {
char buf[4096]; char buf[4096];
/* Okay!! Now we can write the descriptor... */ /* Okay!! Now we can write the descriptor... */