mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
r15593@catbus: nickm | 2007-10-09 15:31:10 -0400
Fix an infinite loop when parsing multiple votes. svn:r11813
This commit is contained in:
parent
a2005cd2c1
commit
0827d6f217
@ -1359,6 +1359,8 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out)
|
|||||||
|
|
||||||
again:
|
again:
|
||||||
vote = networkstatus_parse_vote_from_string(vote_body, &end_of_vote, 1);
|
vote = networkstatus_parse_vote_from_string(vote_body, &end_of_vote, 1);
|
||||||
|
if (!end_of_vote)
|
||||||
|
end_of_vote = vote_body + strlen(vote_body);
|
||||||
if (!vote) {
|
if (!vote) {
|
||||||
log_warn(LD_DIR, "Couldn't parse vote: length was %d",
|
log_warn(LD_DIR, "Couldn't parse vote: length was %d",
|
||||||
(int)strlen(vote_body));
|
(int)strlen(vote_body));
|
||||||
@ -1424,7 +1426,8 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out)
|
|||||||
"directory.");
|
"directory.");
|
||||||
cached_dir_decref(v->vote_body);
|
cached_dir_decref(v->vote_body);
|
||||||
networkstatus_vote_free(v->vote);
|
networkstatus_vote_free(v->vote);
|
||||||
v->vote_body = new_cached_dir(tor_strdup(vote_body),
|
v->vote_body = new_cached_dir(tor_strndup(vote_body,
|
||||||
|
end_of_vote-vote_body),
|
||||||
vote->published);
|
vote->published);
|
||||||
v->vote = vote;
|
v->vote = vote;
|
||||||
if (end_of_vote &&
|
if (end_of_vote &&
|
||||||
@ -1444,13 +1447,16 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out)
|
|||||||
});
|
});
|
||||||
|
|
||||||
pending_vote = tor_malloc_zero(sizeof(pending_vote_t));
|
pending_vote = tor_malloc_zero(sizeof(pending_vote_t));
|
||||||
pending_vote->vote_body = new_cached_dir(tor_strdup(vote_body),
|
pending_vote->vote_body = new_cached_dir(tor_strndup(vote_body,
|
||||||
|
end_of_vote-vote_body),
|
||||||
vote->published);
|
vote->published);
|
||||||
pending_vote->vote = vote;
|
pending_vote->vote = vote;
|
||||||
smartlist_add(pending_vote_list, pending_vote);
|
smartlist_add(pending_vote_list, pending_vote);
|
||||||
|
|
||||||
if (end_of_vote && !strcmpstart(end_of_vote, "network-status-version "))
|
if (!strcmpstart(end_of_vote, "network-status-version ")) {
|
||||||
|
vote_body = end_of_vote;
|
||||||
goto again;
|
goto again;
|
||||||
|
}
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
@ -1465,8 +1471,10 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out)
|
|||||||
if (vote)
|
if (vote)
|
||||||
networkstatus_vote_free(vote);
|
networkstatus_vote_free(vote);
|
||||||
|
|
||||||
if (end_of_vote && !strcmpstart(end_of_vote, "network-status-version "))
|
if (end_of_vote && !strcmpstart(end_of_vote, "network-status-version ")) {
|
||||||
|
vote_body = end_of_vote;
|
||||||
goto again;
|
goto again;
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user