Browse Source

Fix some harmless/untriggerable memory leaks found by coverity

Nick Mathewson 10 years ago
parent
commit
f0bce2dc35
5 changed files with 33 additions and 22 deletions
  1. 6 0
      changes/cov-leaks
  2. 8 8
      src/or/dirserv.c
  3. 1 1
      src/test/test_addr.c
  4. 15 13
      src/test/test_util.c
  5. 3 0
      src/tools/tor-gencert.c

+ 6 - 0
changes/cov-leaks

@@ -0,0 +1,6 @@
+  o Minor bugfixes:
+    - Resolve some memory leaks found by coverity in the unit tests,
+      on exit in tor-gencert, and on a failure to compute digests
+      for our own keys when generating a v3 networkstatus vote.
+      These leaks should never have affected anyone in practice.
+

+ 8 - 8
src/or/dirserv.c

@@ -2578,14 +2578,6 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
   tor_assert(private_key);
   tor_assert(private_key);
   tor_assert(cert);
   tor_assert(cert);
 
 
-  if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
-    log_warn(LD_NET, "Couldn't resolve my hostname");
-    return NULL;
-  }
-  if (!hostname || !strchr(hostname, '.')) {
-    tor_free(hostname);
-    hostname = tor_dup_ip(addr);
-  }
   if (crypto_pk_get_digest(private_key, signing_key_digest)<0) {
   if (crypto_pk_get_digest(private_key, signing_key_digest)<0) {
     log_err(LD_BUG, "Error computing signing key digest");
     log_err(LD_BUG, "Error computing signing key digest");
     return NULL;
     return NULL;
@@ -2594,6 +2586,14 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
     log_err(LD_BUG, "Error computing identity key digest");
     log_err(LD_BUG, "Error computing identity key digest");
     return NULL;
     return NULL;
   }
   }
+  if (resolve_my_address(LOG_WARN, options, &addr, NULL, &hostname)<0) {
+    log_warn(LD_NET, "Couldn't resolve my hostname");
+    return NULL;
+  }
+  if (!hostname || !strchr(hostname, '.')) {
+    tor_free(hostname);
+    hostname = tor_dup_ip(addr);
+  }
 
 
   if (options->VersioningAuthoritativeDir) {
   if (options->VersioningAuthoritativeDir) {
     client_versions = format_versions_list(options->RecommendedClientVersions);
     client_versions = format_versions_list(options->RecommendedClientVersions);

+ 1 - 1
src/test/test_addr.c

@@ -73,7 +73,7 @@ test_addr_basic(void)
   }
   }
 
 
  done:
  done:
-  ;
+  tor_free(cp);
 }
 }
 
 
 #define test_op_ip6_(a,op,b,e1,e2)                               \
 #define test_op_ip6_(a,op,b,e1,e2)                               \

+ 15 - 13
src/test/test_util.c

@@ -1189,19 +1189,19 @@ test_util_strmisc(void)
   }
   }
 
 
   /* Test str-foo functions */
   /* Test str-foo functions */
-  cp = tor_strdup("abcdef");
-  test_assert(tor_strisnonupper(cp));
-  cp[3] = 'D';
-  test_assert(!tor_strisnonupper(cp));
-  tor_strupper(cp);
-  test_streq(cp, "ABCDEF");
-  tor_strlower(cp);
-  test_streq(cp, "abcdef");
-  test_assert(tor_strisnonupper(cp));
-  test_assert(tor_strisprint(cp));
-  cp[3] = 3;
-  test_assert(!tor_strisprint(cp));
-  tor_free(cp);
+  cp_tmp = tor_strdup("abcdef");
+  test_assert(tor_strisnonupper(cp_tmp));
+  cp_tmp[3] = 'D';
+  test_assert(!tor_strisnonupper(cp_tmp));
+  tor_strupper(cp_tmp);
+  test_streq(cp_tmp, "ABCDEF");
+  tor_strlower(cp_tmp);
+  test_streq(cp_tmp, "abcdef");
+  test_assert(tor_strisnonupper(cp_tmp));
+  test_assert(tor_strisprint(cp_tmp));
+  cp_tmp[3] = 3;
+  test_assert(!tor_strisprint(cp_tmp));
+  tor_free(cp_tmp);
 
 
   /* Test memmem and memstr */
   /* Test memmem and memstr */
   {
   {
@@ -2325,6 +2325,8 @@ test_util_listdir(void *ptr)
  done:
  done:
   tor_free(fname1);
   tor_free(fname1);
   tor_free(fname2);
   tor_free(fname2);
+  tor_free(fname3);
+  tor_free(dir1);
   tor_free(dirname);
   tor_free(dirname);
   if (dir_contents) {
   if (dir_contents) {
     SMARTLIST_FOREACH(dir_contents, char *, cp, tor_free(cp));
     SMARTLIST_FOREACH(dir_contents, char *, cp, tor_free(cp));

+ 3 - 0
src/tools/tor-gencert.c

@@ -547,6 +547,9 @@ main(int argc, char **argv)
   if (signing_key)
   if (signing_key)
     EVP_PKEY_free(signing_key);
     EVP_PKEY_free(signing_key);
   tor_free(address);
   tor_free(address);
+  tor_free(identity_key_file);
+  tor_free(signing_key_file);
+  tor_free(certificate_file);
 
 
   crypto_global_cleanup();
   crypto_global_cleanup();
   return r;
   return r;