[tor-commits] [obfsproxy/master] Fix a memory leak in obfs2.c:derive_padding_key (and be scrupulous about tearing down everything at shutdown time, too)

nickm at torproject.org nickm at torproject.org
Fri Sep 9 17:08:56 UTC 2011


commit d4c299eeb58772fa9a76b8195ba8b803988f9938
Author: Zack Weinberg <zackw at panix.com>
Date:   Tue Jul 19 11:08:52 2011 -0700

    Fix a memory leak in obfs2.c:derive_padding_key (and be scrupulous about tearing down everything at shutdown time, too)
---
 src/crypt.c           |    4 ++--
 src/main.c            |   19 +++++++++++++++++--
 src/protocols/obfs2.c |   10 ++--------
 3 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/crypt.c b/src/crypt.c
index 98516e6..e338214 100644
--- a/src/crypt.c
+++ b/src/crypt.c
@@ -26,7 +26,7 @@
 #endif
 
 /**
-   Initializes the obfs2 crypto subsystem.
+   Initializes the crypto subsystem.
 */
 int
 initialize_crypto(void)
@@ -58,7 +58,7 @@ initialize_crypto(void)
 }
 
 /**
-   Cleans up the obfs2 crypto subsystem.
+   Cleans up the crypto subsystem.
 */
 void
 cleanup_crypto(void)
diff --git a/src/main.c b/src/main.c
index cf811fa..254be94 100644
--- a/src/main.c
+++ b/src/main.c
@@ -4,6 +4,7 @@
 
 #include "util.h"
 
+#include "crypt.h"
 #include "network.h"
 #include "protocol.h"
 
@@ -14,6 +15,7 @@
 #include <string.h>
 
 #include <event2/event.h>
+#include <event2/dns.h>
 
 /* The character that seperates multiple listeners in the cli */
 #define SEPARATOR "+"
@@ -305,6 +307,12 @@ main(int argc, const char **argv)
   WSAStartup(0x101, &wsaData);
 #endif
 
+  /* Initialize crypto */
+  if (initialize_crypto() < 0) {
+    log_warn("Can't initialize crypto; failing");
+    return 1;
+  }
+
   /* Initialize libevent */
   the_event_base = event_base_new();
   if (!the_event_base) {
@@ -365,14 +373,21 @@ main(int argc, const char **argv)
             "%d survived.",
             n_protocols, actual_protocols,n_listeners);
 
-  /* run the event loop if at least a listener was created. */
+  /* run the event loop if at least one listener was created. */
   if (n_listeners)
     event_base_dispatch(the_event_base);
 
   log_info("Exiting.");
 
-  close_obfsproxy_logfile();
   free_all_listeners();
+  evdns_base_free(get_evdns_base(), 0);
+  event_free(sig_int);
+  event_free(sig_term);
+  event_base_free(the_event_base);
+
+  cleanup_crypto();
+
+  close_obfsproxy_logfile();
   free(protocol_options);
   free(n_options_array);
   free(protocols);
diff --git a/src/protocols/obfs2.c b/src/protocols/obfs2.c
index f17af90..5c9aedc 100644
--- a/src/protocols/obfs2.c
+++ b/src/protocols/obfs2.c
@@ -27,7 +27,6 @@ downcast(struct protocol_t *proto)
 /*
    This function parses 'options' and fills the protocol parameters
    structure 'params'.
-   It then fills the obfs2 vtable and initializes the crypto subsystem.
 
    Returns 0 on success, -1 on fail.
 */
@@ -43,12 +42,6 @@ obfs2_init(int n_options, const char *const *options)
     return NULL;
   }
 
-  if (initialize_crypto() < 0) {
-    log_warn("Can't initialize crypto; failing");
-    free(params);
-    return NULL;
-  }
-
   return params;
 }
 
@@ -219,6 +212,7 @@ derive_padding_key(void *s, const uchar *seed,
     digest_update(c, state->secret_seed, OBFUSCATE_SEED_LENGTH);
   digest_update(c, (uchar*)keytype, strlen(keytype));
   digest_getdigest(c, buf, sizeof(buf));
+  digest_free(c);
 
   if (seed_nonzero(state->secret_seed)) {
     digest_t *d;
@@ -227,13 +221,13 @@ derive_padding_key(void *s, const uchar *seed,
       d = digest_new();
       digest_update(d, buf, sizeof(buf));
       digest_getdigest(d, buf, sizeof(buf));
+      digest_free(d);
     }
   }
 
   cryptstate = crypt_new(buf, 16);
   crypt_set_iv(cryptstate, buf+16, 16);
   memset(buf, 0, 16);
-  digest_free(c);
   return cryptstate;
 }
 





More information about the tor-commits mailing list