[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] Fix an impossible-in-normal-operation leaks in dirvote
commit f272ee6a20ec0df491bed485a0eea4ae2f82e40c
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Fri Dec 28 23:04:44 2012 -0500
Fix an impossible-in-normal-operation leaks in dirvote
Spotted by coverity; partial fix for 7816; bugfix on 0.2.0.5-alpha.
---
changes/bug7816.024 | 4 ++++
src/or/dirvote.c | 20 +++++++++++---------
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/changes/bug7816.024 b/changes/bug7816.024
index 6ed6b74..b5d55f5 100644
--- a/changes/bug7816.024
+++ b/changes/bug7816.024
@@ -2,3 +2,7 @@
- Avoid leaking IPv6 policy content if we fail to format it into
a router descriptor. Spotted by Coverity. Fixes part of 7816;
bugfix on 0.2.4.7-alpha.
+
+ - Avoid leaking memory if we fail to compute a consensus signature
+ or we generated a consensus we couldn't parse. Spotted by Coverity.
+ Fixes part of 7816; bugfix on 0.2.0.5-alpha.
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 1b9af0f..72ae097 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -2139,7 +2139,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
digest, digest_len,
legacy_signing_key)) {
log_warn(LD_BUG, "Couldn't sign consensus networkstatus.");
- return NULL; /* This leaks, but it should never happen. */
+ goto done;
}
smartlist_add(chunks, tor_strdup(sigbuf));
}
@@ -2147,13 +2147,6 @@ networkstatus_compute_consensus(smartlist_t *votes,
result = smartlist_join_strings(chunks, "", 0, NULL);
- tor_free(client_versions);
- tor_free(server_versions);
- SMARTLIST_FOREACH(flags, char *, cp, tor_free(cp));
- smartlist_free(flags);
- SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
- smartlist_free(chunks);
-
{
networkstatus_t *c;
if (!(c = networkstatus_parse_vote_from_string(result, NULL,
@@ -2161,7 +2154,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
log_err(LD_BUG, "Generated a networkstatus consensus we couldn't "
"parse.");
tor_free(result);
- return NULL;
+ goto done;
}
// Verify balancing parameters
if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS && added_weights) {
@@ -2170,6 +2163,15 @@ networkstatus_compute_consensus(smartlist_t *votes,
networkstatus_vote_free(c);
}
+ done:
+
+ tor_free(client_versions);
+ tor_free(server_versions);
+ SMARTLIST_FOREACH(flags, char *, cp, tor_free(cp));
+ smartlist_free(flags);
+ SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
+ smartlist_free(chunks);
+
return result;
}
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits