[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] [tor/master] Fix a memory leak in summarizing directory request timing.



Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Fri, 21 Aug 2009 13:17:50 -0400
Subject: Fix a memory leak in summarizing directory request timing.
Commit: d4a75a222f8da50caaafe42464809b0856f724eb

Spotted by Coverity Scan.
---
 src/or/geoip.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/or/geoip.c b/src/or/geoip.c
index 5c13154..ef0d29e 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -743,7 +743,8 @@ geoip_get_dirreq_history(geoip_client_action_t action,
                                                  &ent->completion_time);
         if (time_diff == 0)
           time_diff = 1; /* Avoid DIV/0; "instant" answers are impossible
-                          * anyway by law of nature or something.. */
+                          * by law of nature or something, but a milisecond
+                          * is a bit greater than "instantly" */
         *bytes_per_second = 1000 * ent->response_size / time_diff;
         smartlist_add(dirreq_times, bytes_per_second);
         complete++;
@@ -767,8 +768,11 @@ geoip_get_dirreq_history(geoip_client_action_t action,
   result = tor_malloc_zero(bufsize);
   written = tor_snprintf(result, bufsize, "complete=%u,timeout=%u,"
                          "running=%u", complete, timeouts, running);
-  if (written < 0)
+  if (written < 0) {
+    SMARTLIST_FOREACH(dirreq_times, uint32_t *, dlt, tor_free(dlt));
+    smartlist_free(dirreq_times);
     return NULL;
+  }
 #define MIN_DIR_REQ_RESPONSES 16
   if (complete >= MIN_DIR_REQ_RESPONSES) {
     uint32_t *dltimes = tor_malloc(sizeof(uint32_t) * complete);
@@ -794,9 +798,11 @@ geoip_get_dirreq_history(geoip_client_action_t action,
                            dltimes[9*complete/10-1],
                            dltimes[complete-1]);
     tor_free(dltimes);
+  } else {
+    SMARTLIST_FOREACH(dirreq_times, uint32_t *, dlt, tor_free(dlt));
   }
   if (written < 0)
-    result = NULL;
+    tor_free(result);
   smartlist_free(dirreq_times);
   return result;
 }
-- 
1.5.6.5