
commit a47b61f329fbe06b7b4935cf9c1923d96a74b649 Merge: 57999e330 3767eff9b Author: Nick Mathewson <nickm@torproject.org> Date: Tue Mar 26 20:13:49 2019 -0400 Merge branch 'messaging_v3' into messaging_v3_merged .gitignore | 4 + Makefile.am | 4 + changes/pubsub | 5 + doc/tor.1.txt | 2 +- src/app/main/main.c | 179 ++------- src/app/main/main.h | 3 - src/app/main/ntmain.c | 1 + src/app/main/shutdown.c | 192 ++++++++++ src/app/main/shutdown.h | 18 + src/app/main/subsysmgr.c | 52 ++- src/app/main/subsysmgr.h | 5 + src/core/include.am | 4 + src/core/mainloop/mainloop_pubsub.c | 170 +++++++++ src/core/mainloop/mainloop_pubsub.h | 24 ++ src/include.am | 2 + src/lib/cc/compat_compiler.h | 12 + src/lib/container/include.am | 3 + src/lib/container/namemap.c | 184 ++++++++++ src/lib/container/namemap.h | 35 ++ src/lib/container/namemap_st.h | 34 ++ src/lib/dispatch/.may_include | 10 + src/lib/dispatch/dispatch.h | 114 ++++++ src/lib/dispatch/dispatch_cfg.c | 141 ++++++++ src/lib/dispatch/dispatch_cfg.h | 39 ++ src/lib/dispatch/dispatch_cfg_st.h | 25 ++ src/lib/dispatch/dispatch_core.c | 260 +++++++++++++ src/lib/dispatch/dispatch_naming.c | 63 ++++ src/lib/dispatch/dispatch_naming.h | 46 +++ src/lib/dispatch/dispatch_new.c | 174 +++++++++ src/lib/dispatch/dispatch_st.h | 108 ++++++ src/lib/dispatch/include.am | 25 ++ src/lib/dispatch/msgtypes.h | 80 ++++ src/lib/log/log.c | 6 +- src/lib/log/log.h | 22 +- src/lib/pubsub/.may_include | 10 + src/lib/pubsub/include.am | 26 ++ src/lib/pubsub/pub_binding_st.h | 38 ++ src/lib/pubsub/pubsub.h | 89 +++++ src/lib/pubsub/pubsub_build.c | 307 ++++++++++++++++ src/lib/pubsub/pubsub_build.h | 92 +++++ src/lib/pubsub/pubsub_builder_st.h | 161 +++++++++ src/lib/pubsub/pubsub_check.c | 428 ++++++++++++++++++++++ src/lib/pubsub/pubsub_connect.h | 54 +++ src/lib/pubsub/pubsub_flags.h | 32 ++ src/lib/pubsub/pubsub_macros.h | 373 +++++++++++++++++++ src/lib/pubsub/pubsub_publish.c | 72 ++++ src/lib/pubsub/pubsub_publish.h | 15 + src/lib/smartlist_core/smartlist_core.c | 24 ++ src/lib/smartlist_core/smartlist_core.h | 1 + src/lib/subsys/subsys.h | 4 +- src/test/include.am | 4 + src/test/test.c | 4 + src/test/test.h | 4 + src/test/test_containers.c | 61 ++++ src/test/test_dispatch.c | 249 +++++++++++++ src/test/test_namemap.c | 174 +++++++++ src/test/test_pubsub_build.c | 621 ++++++++++++++++++++++++++++++++ src/test/test_pubsub_msg.c | 305 ++++++++++++++++ 58 files changed, 5033 insertions(+), 161 deletions(-) diff --cc src/app/main/main.c index 83eef0dc7,21e02f9ef..184b9e91d --- a/src/app/main/main.c +++ b/src/app/main/main.c @@@ -38,14 -33,7 +33,9 @@@ #include "feature/api/tor_api.h" #include "feature/api/tor_api_internal.h" #include "feature/client/addressmap.h" - #include "feature/client/bridges.h" - #include "feature/client/entrynodes.h" - #include "feature/client/transports.h" #include "feature/control/control.h" +#include "feature/control/control_auth.h" +#include "feature/control/control_events.h" - #include "feature/dirauth/bwauth.h" #include "feature/dirauth/keypin.h" #include "feature/dirauth/process_descs.h" #include "feature/dircache/consdiffmgr.h" diff --cc src/app/main/shutdown.c index 000000000,a4e6cb088..314e33f22 mode 000000,100644..100644 --- a/src/app/main/shutdown.c +++ b/src/app/main/shutdown.c @@@ -1,0 -1,192 +1,192 @@@ + /* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2018, The Tor Project, Inc. */ + /* See LICENSE for licensing information */ + + /** + * @file shutdown.c + * @brief Code to free global resources used by Tor. + * + * In the future, this should all be handled by the subsystem manager. */ + + #include "core/or/or.h" + + #include "app/config/config.h" + #include "app/config/statefile.h" + #include "app/main/main.h" + #include "app/main/shutdown.h" + #include "app/main/subsysmgr.h" + #include "core/mainloop/connection.h" + #include "core/mainloop/mainloop.h" + #include "core/mainloop/mainloop_pubsub.h" + #include "core/or/channeltls.h" + #include "core/or/circuitlist.h" + #include "core/or/circuitmux_ewma.h" + #include "core/or/circuitpadding.h" + #include "core/or/connection_edge.h" + #include "core/or/dos.h" + #include "core/or/policies.h" + #include "core/or/protover.h" + #include "core/or/scheduler.h" + #include "core/or/versions.h" + #include "feature/client/addressmap.h" + #include "feature/client/bridges.h" + #include "feature/client/entrynodes.h" + #include "feature/client/transports.h" + #include "feature/control/control.h" -#include "feature/control/control.h" ++#include "feature/control/control_auth.h" + #include "feature/dirauth/authmode.h" + #include "feature/dirauth/bwauth.h" + #include "feature/dirauth/dirvote.h" + #include "feature/dirauth/keypin.h" + #include "feature/dirauth/process_descs.h" + #include "feature/dirauth/shared_random.h" + #include "feature/dircache/consdiffmgr.h" + #include "feature/dircache/dirserv.h" + #include "feature/dirparse/routerparse.h" + #include "feature/hibernate/hibernate.h" + #include "feature/hs/hs_common.h" + #include "feature/nodelist/microdesc.h" + #include "feature/nodelist/networkstatus.h" + #include "feature/nodelist/nodelist.h" + #include "feature/nodelist/routerlist.h" + #include "feature/nodelist/routerlist.h" + #include "feature/relay/dns.h" + #include "feature/relay/ext_orport.h" + #include "feature/relay/onion_queue.h" + #include "feature/relay/routerkeys.h" + #include "feature/rend/rendcache.h" + #include "feature/rend/rendclient.h" + #include "feature/stats/geoip_stats.h" + #include "feature/stats/rephist.h" + #include "lib/evloop/compat_libevent.h" + #include "lib/geoip/geoip.h" + #include "src/feature/relay/router.h" + + void evdns_shutdown(int); + + /** Do whatever cleanup is necessary before shutting Tor down. */ + void + tor_cleanup(void) + { + const or_options_t *options = get_options(); + if (options->command == CMD_RUN_TOR) { + time_t now = time(NULL); + /* Remove our pid file. We don't care if there was an error when we + * unlink, nothing we could do about it anyways. */ + tor_remove_file(options->PidFile); + /* Remove control port file */ + tor_remove_file(options->ControlPortWriteToFile); + /* Remove cookie authentication file */ + { + char *cookie_fname = get_controller_cookie_file_name(); + tor_remove_file(cookie_fname); + tor_free(cookie_fname); + } + /* Remove Extended ORPort cookie authentication file */ + { + char *cookie_fname = get_ext_or_auth_cookie_file_name(); + tor_remove_file(cookie_fname); + tor_free(cookie_fname); + } + if (accounting_is_enabled(options)) + accounting_record_bandwidth_usage(now, get_or_state()); + or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */ + or_state_save(now); + if (authdir_mode(options)) { + sr_save_and_cleanup(); + } + if (authdir_mode_tests_reachability(options)) + rep_hist_record_mtbf_data(now, 0); + keypin_close_journal(); + } + + timers_shutdown(); + + tor_free_all(0); /* We could move tor_free_all back into the ifdef below + later, if it makes shutdown unacceptably slow. But for + now, leave it here: it's helped us catch bugs in the + past. */ + } + + /** Free all memory that we might have allocated somewhere. + * If <b>postfork</b>, we are a worker process and we want to free + * only the parts of memory that we won't touch. If !<b>postfork</b>, + * Tor is shutting down and we should free everything. + * + * Helps us find the real leaks with sanitizers and the like. Also valgrind + * should then report 0 reachable in its leak report (in an ideal world -- + * in practice libevent, SSL, libc etc never quite free everything). */ + void + tor_free_all(int postfork) + { + if (!postfork) { + evdns_shutdown(1); + } + geoip_free_all(); + geoip_stats_free_all(); + dirvote_free_all(); + routerlist_free_all(); + networkstatus_free_all(); + addressmap_free_all(); + dirserv_free_fingerprint_list(); + dirserv_free_all(); + dirserv_clear_measured_bw_cache(); + rend_cache_free_all(); + rend_service_authorization_free_all(); + rep_hist_free_all(); + dns_free_all(); + clear_pending_onions(); + circuit_free_all(); + circpad_machines_free(); + entry_guards_free_all(); + pt_free_all(); + channel_tls_free_all(); + channel_free_all(); + connection_free_all(); + connection_edge_free_all(); + scheduler_free_all(); + nodelist_free_all(); + microdesc_free_all(); + routerparse_free_all(); + ext_orport_free_all(); + control_free_all(); + protover_free_all(); + bridges_free_all(); + consdiffmgr_free_all(); + hs_free_all(); + dos_free_all(); + circuitmux_ewma_free_all(); + accounting_free_all(); + protover_summary_cache_free_all(); + + if (!postfork) { + config_free_all(); + or_state_free_all(); + router_free_all(); + routerkeys_free_all(); + policies_free_all(); + } + if (!postfork) { + #ifndef _WIN32 + tor_getpwnam(NULL); + #endif + } + /* stuff in main.c */ + + tor_mainloop_disconnect_pubsub(); + tor_mainloop_free_all(); + + if (!postfork) { + release_lockfile(); + } + tor_libevent_free_all(); + + subsystems_shutdown(); + + /* Stuff in util.c and address.c*/ + if (!postfork) { + esc_router_info(NULL); + } + }