Always call tor_free_all() when exiting tor_run_main()

We would usually call it through tor_cleanup(), but in some code
paths, we wouldn't. These paths would break restart-in-process,
since leaving fields uncleared would cause assertion failures on
restart.

Fixes bug 26948; bugfix on 0.3.3.1-alpha
This commit is contained in:
Nick Mathewson 2018-07-31 08:41:27 -04:00
parent 373b23a9ee
commit a67d153cc7
2 changed files with 9 additions and 4 deletions

4
changes/bug26948 Normal file
View File

@ -0,0 +1,4 @@
o Minor bugfixes (in-process restart):
- Always call tor_free_all() when leaving tor_run_main(). When we
did not, restarting tor in-process would cause an assertion failure.
Fixes bug 26948; bugfix on 0.3.3.1-alpha.

View File

@ -4035,10 +4035,10 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
#endif /* defined(NT_SERVICE) */ #endif /* defined(NT_SERVICE) */
{ {
int init_rv = tor_init(argc, argv); int init_rv = tor_init(argc, argv);
if (init_rv < 0) if (init_rv) {
return -1; tor_free_all(0);
else if (init_rv > 0) return (init_rv < 0) ? -1 : 0;
return 0; }
} }
if (get_options()->Sandbox && get_options()->command == CMD_RUN_TOR) { if (get_options()->Sandbox && get_options()->command == CMD_RUN_TOR) {
@ -4046,6 +4046,7 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
if (sandbox_init(cfg)) { if (sandbox_init(cfg)) {
log_err(LD_BUG,"Failed to create syscall sandbox filter"); log_err(LD_BUG,"Failed to create syscall sandbox filter");
tor_free_all(0);
return -1; return -1;
} }