]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
When freeing a cert_list_t, avoid memory leak.
authorNick Mathewson <nickm@torproject.org>
Thu, 19 Sep 2013 16:22:49 +0000 (12:22 -0400)
committerNick Mathewson <nickm@torproject.org>
Thu, 19 Sep 2013 16:22:49 +0000 (12:22 -0400)
We were freeing these on exit, but when we added the dl_status_map
field to them in fddb814f, we forgot to arrange for it to be freed.

I've moved the cert_list_free() code into its own function, and added
an appropriate dsmap_free() call.

Fixes bug 9644; bugfix on 0.2.4.13-alpha.

changes/bug9644 [new file with mode: 0644]
src/or/routerlist.c

diff --git a/changes/bug9644 b/changes/bug9644
new file mode 100644 (file)
index 0000000..51c58a5
--- /dev/null
@@ -0,0 +1,4 @@
+  o Minor bugfixes:
+    - Fix a small memory leak on exit. (We weren't freeing directory
+      authority certificate download statuses.) Fixes bug 9644; bugfix
+      on 0.2.4.13-alpha.
index c2220f4ca91d643b69cc7d22f402fe4d4d901606..c28de24b66feabede3218d8d2b56e496d2ec7ea5 100644 (file)
@@ -241,6 +241,27 @@ get_cert_list(const char *id_digest)
   return cl;
 }
 
+/** Release all space held by a cert_list_t */
+static void
+cert_list_free(cert_list_t *cl)
+{
+  if (!cl)
+    return;
+
+  SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert,
+                    authority_cert_free(cert));
+  smartlist_free(cl->certs);
+  dsmap_free(cl->dl_status_map, tor_free_);
+  tor_free(cl);
+}
+
+/** Wrapper for cert_list_free so we can pass it to digestmap_free */
+static void
+cert_list_free_(void *cl)
+{
+  cert_list_free(cl);
+}
+
 /** Reload the cached v3 key certificates from the cached-certs file in
  * the data directory. Return 0 on success, -1 on failure. */
 int
@@ -3324,13 +3345,7 @@ routerlist_free_all(void)
   smartlist_free(fallback_dir_servers);
   trusted_dir_servers = fallback_dir_servers = NULL;
   if (trusted_dir_certs) {
-    DIGESTMAP_FOREACH(trusted_dir_certs, key, cert_list_t *, cl) {
-      SMARTLIST_FOREACH(cl->certs, authority_cert_t *, cert,
-                        authority_cert_free(cert));
-      smartlist_free(cl->certs);
-      tor_free(cl);
-    } DIGESTMAP_FOREACH_END;
-    digestmap_free(trusted_dir_certs, NULL);
+    digestmap_free(trusted_dir_certs, cert_list_free_);
     trusted_dir_certs = NULL;
   }
 }