diff options
author | Nick Mathewson <nickm@torproject.org> | 2013-10-10 11:23:46 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2013-10-10 11:23:46 -0400 |
commit | 2c7ed0406f04caa1609014f66c08964c8b38d0b9 (patch) | |
tree | 95dd34195047671a412b5d1cfbd21ea85128aa94 | |
parent | 7b1b8c36942a09ff4c50ac228f465aa4050153e3 (diff) | |
parent | 7dbf66713f22b5e04a36d300307a4df7e375e76b (diff) | |
download | tor-2c7ed0406f04caa1609014f66c08964c8b38d0b9.tar.gz tor-2c7ed0406f04caa1609014f66c08964c8b38d0b9.zip |
Merge branch 'bug9644_024' into maint-0.2.4
-rw-r--r-- | changes/bug9644 | 4 | ||||
-rw-r--r-- | src/or/routerlist.c | 29 |
2 files changed, 26 insertions, 7 deletions
diff --git a/changes/bug9644 b/changes/bug9644 new file mode 100644 index 0000000000..51c58a5fff --- /dev/null +++ b/changes/bug9644 @@ -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. diff --git a/src/or/routerlist.c b/src/or/routerlist.c index c2220f4ca9..c28de24b66 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -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; } } |