1 /* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
9 * @brief Code to free global resources used by Tor.
11 * In the future, this should all be handled by the subsystem manager. */
13 #include "core/or/or.h"
15 #include "app/config/config.h"
16 #include "app/config/statefile.h"
17 #include "app/main/main.h"
18 #include "app/main/shutdown.h"
19 #include "app/main/subsysmgr.h"
20 #include "core/mainloop/connection.h"
21 #include "core/mainloop/mainloop_pubsub.h"
22 #include "core/or/channeltls.h"
23 #include "core/or/circuitlist.h"
24 #include "core/or/circuitmux_ewma.h"
25 #include "core/or/circuitpadding.h"
26 #include "core/or/connection_edge.h"
27 #include "core/or/dos.h"
28 #include "core/or/scheduler.h"
29 #include "feature/client/addressmap.h"
30 #include "feature/client/bridges.h"
31 #include "feature/client/entrynodes.h"
32 #include "feature/client/transports.h"
33 #include "feature/control/control.h"
34 #include "feature/control/control_auth.h"
35 #include "feature/dirauth/authmode.h"
36 #include "feature/dirauth/shared_random.h"
37 #include "feature/dircache/consdiffmgr.h"
38 #include "feature/dircache/dirserv.h"
39 #include "feature/dirparse/routerparse.h"
40 #include "feature/hibernate/hibernate.h"
41 #include "feature/hs/hs_common.h"
42 #include "feature/nodelist/microdesc.h"
43 #include "feature/nodelist/networkstatus.h"
44 #include "feature/nodelist/nodelist.h"
45 #include "feature/nodelist/routerlist.h"
46 #include "feature/relay/ext_orport.h"
47 #include "feature/relay/relay_config.h"
48 #include "feature/stats/bwhist.h"
49 #include "feature/stats/geoip_stats.h"
50 #include "feature/stats/rephist.h"
51 #include "lib/evloop/compat_libevent.h"
52 #include "lib/geoip/geoip.h"
54 void evdns_shutdown(int);
56 /** Do whatever cleanup is necessary before shutting Tor down. */
60 const or_options_t
*options
= get_options();
61 if (options
->command
== CMD_RUN_TOR
) {
62 time_t now
= time(NULL
);
63 /* Remove our pid file. We don't care if there was an error when we
64 * unlink, nothing we could do about it anyways. */
65 tor_remove_file(options
->PidFile
);
66 /* Remove control port file */
67 tor_remove_file(options
->ControlPortWriteToFile
);
68 /* Remove cookie authentication file */
70 char *cookie_fname
= get_controller_cookie_file_name();
71 tor_remove_file(cookie_fname
);
72 tor_free(cookie_fname
);
74 /* Remove Extended ORPort cookie authentication file */
76 char *cookie_fname
= get_ext_or_auth_cookie_file_name();
78 tor_remove_file(cookie_fname
);
79 tor_free(cookie_fname
);
81 if (accounting_is_enabled(options
))
82 accounting_record_bandwidth_usage(now
, get_or_state());
83 or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */
85 if (authdir_mode(options
)) {
86 sr_save_and_cleanup();
88 if (authdir_mode_tests_reachability(options
))
89 rep_hist_record_mtbf_data(now
, 0);
94 tor_free_all(0); /* We could move tor_free_all back into the ifdef below
95 later, if it makes shutdown unacceptably slow. But for
96 now, leave it here: it's helped us catch bugs in the
100 /** Free all memory that we might have allocated somewhere.
101 * If <b>postfork</b>, we are a worker process and we want to free
102 * only the parts of memory that we won't touch. If !<b>postfork</b>,
103 * Tor is shutting down and we should free everything.
105 * Helps us find the real leaks with sanitizers and the like. Also valgrind
106 * should then report 0 reachable in its leak report (in an ideal world --
107 * in practice libevent, SSL, libc etc never quite free everything). */
109 tor_free_all(int postfork
)
115 geoip_stats_free_all();
116 routerlist_free_all();
117 networkstatus_free_all();
118 addressmap_free_all();
123 circpad_machines_free();
124 entry_guards_free_all();
126 channel_tls_free_all();
128 connection_free_all();
129 connection_edge_free_all();
130 scheduler_free_all();
132 microdesc_free_all();
133 routerparse_free_all();
136 consdiffmgr_free_all();
139 circuitmux_ewma_free_all();
140 accounting_free_all();
145 relay_config_free_all();
153 /* stuff in main.c */
155 tor_mainloop_disconnect_pubsub();
161 subsystems_shutdown();
163 /* Stuff in util.c and address.c*/
165 esc_router_info(NULL
);