|
@@ -1212,8 +1212,15 @@ dirvote_add_vote(const char *vote_body, const char **msg_out)
|
|
|
if (! memcmp(v->vote->cert->cache_info.identity_digest,
|
|
|
vote->cert->cache_info.identity_digest,
|
|
|
DIGEST_LEN)) {
|
|
|
- log_notice(LD_DIR, "We already have a pending vote from this dir");
|
|
|
- if (v->vote->published < vote->published) {
|
|
|
+ networkstatus_voter_info_t *vi_old = smartlist_get(v->vote->voters, 0);
|
|
|
+ if (!memcmp(vi_old->vote_digest, vi->vote_digest, DIGEST_LEN)) {
|
|
|
+
|
|
|
+ log_info(LD_DIR, "Discarding a vote we already have.");
|
|
|
+ *msg_out = "ok";
|
|
|
+ goto err;
|
|
|
+ } else if (v->vote->published < vote->published) {
|
|
|
+ log_notice(LD_DIR, "Replacing an older pending vote from this "
|
|
|
+ "directory.");
|
|
|
cached_dir_decref(v->vote_body);
|
|
|
networkstatus_vote_free(v->vote);
|
|
|
v->vote_body = new_cached_dir(tor_strdup(vote_body),
|