Merge branch 'tor-github/pr/1181' into maint-0.4.1

This commit is contained in:
George Kadianakis 2019-07-24 12:31:56 +03:00
commit bb33a2f290
2 changed files with 10 additions and 6 deletions

4
changes/bug31003 Normal file
View File

@ -0,0 +1,4 @@
o Minor bugfixes (crash on exit):
- Avoid a set of possible code paths that could use try to use freed memory
in routerlist_free() while Tor was exiting. Fixes bug 31003; bugfix on
0.1.2.2-alpha.

View File

@ -954,20 +954,18 @@ routerlist_free_(routerlist_t *rl)
smartlist_free(rl->routers); smartlist_free(rl->routers);
smartlist_free(rl->old_routers); smartlist_free(rl->old_routers);
if (rl->desc_store.mmap) { if (rl->desc_store.mmap) {
int res = tor_munmap_file(routerlist->desc_store.mmap); int res = tor_munmap_file(rl->desc_store.mmap);
if (res != 0) { if (res != 0) {
log_warn(LD_FS, "Failed to munmap routerlist->desc_store.mmap"); log_warn(LD_FS, "Failed to munmap routerlist->desc_store.mmap");
} }
} }
if (rl->extrainfo_store.mmap) { if (rl->extrainfo_store.mmap) {
int res = tor_munmap_file(routerlist->extrainfo_store.mmap); int res = tor_munmap_file(rl->extrainfo_store.mmap);
if (res != 0) { if (res != 0) {
log_warn(LD_FS, "Failed to munmap routerlist->extrainfo_store.mmap"); log_warn(LD_FS, "Failed to munmap routerlist->extrainfo_store.mmap");
} }
} }
tor_free(rl); tor_free(rl);
router_dir_info_changed();
} }
/** Log information about how much memory is being used for routerlist, /** Log information about how much memory is being used for routerlist,
@ -1426,8 +1424,10 @@ routerlist_reparse_old(routerlist_t *rl, signed_descriptor_t *sd)
void void
routerlist_free_all(void) routerlist_free_all(void)
{ {
routerlist_free(routerlist); routerlist_t *rl = routerlist;
routerlist = NULL; routerlist = NULL; // Prevent internals of routerlist_free() from using
// routerlist.
routerlist_free(rl);
dirlist_free_all(); dirlist_free_all();
if (warned_nicknames) { if (warned_nicknames) {
SMARTLIST_FOREACH(warned_nicknames, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(warned_nicknames, char *, cp, tor_free(cp));