shutdown.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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-2018, The Tor Project, Inc. */
  5. /* See LICENSE for licensing information */
  6. /**
  7. * @file shutdown.c
  8. * @brief Code to free global resources used by Tor.
  9. *
  10. * In the future, this should all be handled by the subsystem manager. */
  11. #include "core/or/or.h"
  12. #include "app/config/config.h"
  13. #include "app/config/statefile.h"
  14. #include "app/main/main.h"
  15. #include "app/main/shutdown.h"
  16. #include "app/main/subsysmgr.h"
  17. #include "core/mainloop/connection.h"
  18. #include "core/mainloop/mainloop.h"
  19. #include "core/mainloop/mainloop_pubsub.h"
  20. #include "core/or/channeltls.h"
  21. #include "core/or/circuitlist.h"
  22. #include "core/or/circuitmux_ewma.h"
  23. #include "core/or/circuitpadding.h"
  24. #include "core/or/connection_edge.h"
  25. #include "core/or/dos.h"
  26. #include "core/or/policies.h"
  27. #include "core/or/protover.h"
  28. #include "core/or/scheduler.h"
  29. #include "core/or/versions.h"
  30. #include "feature/client/addressmap.h"
  31. #include "feature/client/bridges.h"
  32. #include "feature/client/entrynodes.h"
  33. #include "feature/client/transports.h"
  34. #include "feature/control/control.h"
  35. #include "feature/control/control_auth.h"
  36. #include "feature/dirauth/authmode.h"
  37. #include "feature/dirauth/bwauth.h"
  38. #include "feature/dirauth/dirvote.h"
  39. #include "feature/dirauth/keypin.h"
  40. #include "feature/dirauth/process_descs.h"
  41. #include "feature/dirauth/shared_random.h"
  42. #include "feature/dircache/consdiffmgr.h"
  43. #include "feature/dircache/dirserv.h"
  44. #include "feature/dirparse/routerparse.h"
  45. #include "feature/hibernate/hibernate.h"
  46. #include "feature/hs/hs_common.h"
  47. #include "feature/nodelist/microdesc.h"
  48. #include "feature/nodelist/networkstatus.h"
  49. #include "feature/nodelist/nodelist.h"
  50. #include "feature/nodelist/routerlist.h"
  51. #include "feature/nodelist/routerlist.h"
  52. #include "feature/relay/dns.h"
  53. #include "feature/relay/ext_orport.h"
  54. #include "feature/relay/onion_queue.h"
  55. #include "feature/relay/routerkeys.h"
  56. #include "feature/rend/rendcache.h"
  57. #include "feature/rend/rendclient.h"
  58. #include "feature/stats/geoip_stats.h"
  59. #include "feature/stats/rephist.h"
  60. #include "lib/evloop/compat_libevent.h"
  61. #include "lib/geoip/geoip.h"
  62. #include "src/feature/relay/router.h"
  63. void evdns_shutdown(int);
  64. /** Do whatever cleanup is necessary before shutting Tor down. */
  65. void
  66. tor_cleanup(void)
  67. {
  68. const or_options_t *options = get_options();
  69. if (options->command == CMD_RUN_TOR) {
  70. time_t now = time(NULL);
  71. /* Remove our pid file. We don't care if there was an error when we
  72. * unlink, nothing we could do about it anyways. */
  73. tor_remove_file(options->PidFile);
  74. /* Remove control port file */
  75. tor_remove_file(options->ControlPortWriteToFile);
  76. /* Remove cookie authentication file */
  77. {
  78. char *cookie_fname = get_controller_cookie_file_name();
  79. tor_remove_file(cookie_fname);
  80. tor_free(cookie_fname);
  81. }
  82. /* Remove Extended ORPort cookie authentication file */
  83. {
  84. char *cookie_fname = get_ext_or_auth_cookie_file_name();
  85. tor_remove_file(cookie_fname);
  86. tor_free(cookie_fname);
  87. }
  88. if (accounting_is_enabled(options))
  89. accounting_record_bandwidth_usage(now, get_or_state());
  90. or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */
  91. or_state_save(now);
  92. if (authdir_mode(options)) {
  93. sr_save_and_cleanup();
  94. }
  95. if (authdir_mode_tests_reachability(options))
  96. rep_hist_record_mtbf_data(now, 0);
  97. keypin_close_journal();
  98. }
  99. timers_shutdown();
  100. tor_free_all(0); /* We could move tor_free_all back into the ifdef below
  101. later, if it makes shutdown unacceptably slow. But for
  102. now, leave it here: it's helped us catch bugs in the
  103. past. */
  104. }
  105. /** Free all memory that we might have allocated somewhere.
  106. * If <b>postfork</b>, we are a worker process and we want to free
  107. * only the parts of memory that we won't touch. If !<b>postfork</b>,
  108. * Tor is shutting down and we should free everything.
  109. *
  110. * Helps us find the real leaks with sanitizers and the like. Also valgrind
  111. * should then report 0 reachable in its leak report (in an ideal world --
  112. * in practice libevent, SSL, libc etc never quite free everything). */
  113. void
  114. tor_free_all(int postfork)
  115. {
  116. if (!postfork) {
  117. evdns_shutdown(1);
  118. }
  119. geoip_free_all();
  120. geoip_stats_free_all();
  121. dirvote_free_all();
  122. routerlist_free_all();
  123. networkstatus_free_all();
  124. addressmap_free_all();
  125. dirserv_free_fingerprint_list();
  126. dirserv_free_all();
  127. dirserv_clear_measured_bw_cache();
  128. rend_cache_free_all();
  129. rend_service_authorization_free_all();
  130. rep_hist_free_all();
  131. dns_free_all();
  132. clear_pending_onions();
  133. circuit_free_all();
  134. circpad_machines_free();
  135. entry_guards_free_all();
  136. pt_free_all();
  137. channel_tls_free_all();
  138. channel_free_all();
  139. connection_free_all();
  140. connection_edge_free_all();
  141. scheduler_free_all();
  142. nodelist_free_all();
  143. microdesc_free_all();
  144. routerparse_free_all();
  145. ext_orport_free_all();
  146. control_free_all();
  147. protover_free_all();
  148. bridges_free_all();
  149. consdiffmgr_free_all();
  150. hs_free_all();
  151. dos_free_all();
  152. circuitmux_ewma_free_all();
  153. accounting_free_all();
  154. protover_summary_cache_free_all();
  155. if (!postfork) {
  156. config_free_all();
  157. or_state_free_all();
  158. router_free_all();
  159. routerkeys_free_all();
  160. policies_free_all();
  161. }
  162. if (!postfork) {
  163. #ifndef _WIN32
  164. tor_getpwnam(NULL);
  165. #endif
  166. }
  167. /* stuff in main.c */
  168. tor_mainloop_disconnect_pubsub();
  169. tor_mainloop_free_all();
  170. if (!postfork) {
  171. release_lockfile();
  172. }
  173. tor_libevent_free_all();
  174. subsystems_shutdown();
  175. /* Stuff in util.c and address.c*/
  176. if (!postfork) {
  177. esc_router_info(NULL);
  178. }
  179. }