[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