Make initialization for the "err" library into a subsystem.

This commit is contained in:
Nick Mathewson 2018-11-01 12:40:55 -04:00
parent 6e7ff8cba0
commit 175153a329
8 changed files with 74 additions and 14 deletions

View File

@ -69,7 +69,6 @@
#include "lib/container/buffers.h" #include "lib/container/buffers.h"
#include "lib/crypt_ops/crypto_rand.h" #include "lib/crypt_ops/crypto_rand.h"
#include "lib/crypt_ops/crypto_s2k.h" #include "lib/crypt_ops/crypto_s2k.h"
#include "lib/err/backtrace.h"
#include "lib/geoip/geoip.h" #include "lib/geoip/geoip.h"
#include "lib/process/waitpid.h" #include "lib/process/waitpid.h"
@ -822,7 +821,6 @@ tor_free_all(int postfork)
if (!postfork) { if (!postfork) {
escaped(NULL); escaped(NULL);
esc_router_info(NULL); esc_router_info(NULL);
clean_up_backtrace_handler();
logs_free_all(); /* free log strings. do this last so logs keep working. */ logs_free_all(); /* free log strings. do this last so logs keep working. */
} }
} }
@ -1419,14 +1417,6 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
#endif /* !defined(_WIN64) */ #endif /* !defined(_WIN64) */
#endif /* defined(_WIN32) */ #endif /* defined(_WIN32) */
{
int bt_err = configure_backtrace_handler(get_version());
if (bt_err < 0) {
log_warn(LD_BUG, "Unable to install backtrace handler: %s",
strerror(-bt_err));
}
}
#ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED #ifdef EVENT_SET_MEM_FUNCTIONS_IMPLEMENTED
event_set_mem_functions(tor_malloc_, tor_realloc_, tor_free_); event_set_mem_functions(tor_malloc_, tor_realloc_, tor_free_);
#endif #endif

View File

@ -8,13 +8,15 @@
#include "lib/cc/compat_compiler.h" #include "lib/cc/compat_compiler.h"
#include "lib/cc/torint.h" #include "lib/cc/torint.h"
#include "lib/err/torerr_sys.h"
#include <stddef.h> #include <stddef.h>
/** /**
* Global list of the subsystems in Tor, in the order of their initialization. * Global list of the subsystems in Tor, in the order of their initialization.
**/ **/
const subsys_fns_t *tor_subsystems[] = { const subsys_fns_t *tor_subsystems[] = {
NULL // placeholder. &sys_torerr,
}; };
const unsigned n_tor_subsystems = ARRAY_LENGTH(tor_subsystems); const unsigned n_tor_subsystems = ARRAY_LENGTH(tor_subsystems);

View File

@ -1,3 +1,5 @@
orconfig.h orconfig.h
lib/cc/*.h lib/cc/*.h
lib/err/*.h lib/err/*.h
lib/subsys/*.h
lib/version/*.h

View File

@ -6,8 +6,9 @@ noinst_LIBRARIES += src/lib/libtor-err-testing.a
endif endif
src_lib_libtor_err_a_SOURCES = \ src_lib_libtor_err_a_SOURCES = \
src/lib/err/backtrace.c \ src/lib/err/backtrace.c \
src/lib/err/torerr.c src/lib/err/torerr.c \
src/lib/err/torerr_sys.c
src_lib_libtor_err_testing_a_SOURCES = \ src_lib_libtor_err_testing_a_SOURCES = \
$(src_lib_libtor_err_a_SOURCES) $(src_lib_libtor_err_a_SOURCES)
@ -16,4 +17,5 @@ src_lib_libtor_err_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
noinst_HEADERS += \ noinst_HEADERS += \
src/lib/err/backtrace.h \ src/lib/err/backtrace.h \
src/lib/err/torerr.h src/lib/err/torerr.h \
src/lib/err/torerr_sys.h

View File

@ -122,6 +122,16 @@ tor_log_set_sigsafe_err_fds(const int *fds, int n)
n_sigsafe_log_fds = n; n_sigsafe_log_fds = n;
} }
/**
* Reset the list of emergency error fds to its default.
*/
void
tor_log_reset_sigsafe_err_fds(void)
{
int fds[] = { STDERR_FILENO };
tor_log_set_sigsafe_err_fds(fds, 1);
}
/** /**
* Set the granularity (in ms) to use when reporting fatal errors outside * Set the granularity (in ms) to use when reporting fatal errors outside
* the logging system. * the logging system.

View File

@ -39,6 +39,7 @@ void tor_raw_assertion_failed_msg_(const char *file, int line,
void tor_log_err_sigsafe(const char *m, ...); void tor_log_err_sigsafe(const char *m, ...);
int tor_log_get_sigsafe_err_fds(const int **out); int tor_log_get_sigsafe_err_fds(const int **out);
void tor_log_set_sigsafe_err_fds(const int *fds, int n); void tor_log_set_sigsafe_err_fds(const int *fds, int n);
void tor_log_reset_sigsafe_err_fds(void);
void tor_log_sigsafe_err_set_granularity(int ms); void tor_log_sigsafe_err_set_granularity(int ms);
int format_hex_number_sigsafe(unsigned long x, char *buf, int max_len); int format_hex_number_sigsafe(unsigned long x, char *buf, int max_len);

39
src/lib/err/torerr_sys.c Normal file
View File

@ -0,0 +1,39 @@
/* Copyright (c) 2018, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file torerr_sys.c
* \brief Subsystem object for the error handling subsystem.
**/
#include "orconfig.h"
#include "lib/err/backtrace.h"
#include "lib/err/torerr.h"
#include "lib/err/torerr_sys.h"
#include "lib/subsys/subsys.h"
#include "lib/version/torversion.h"
#include <stddef.h>
static int
torerr_subsys_init(void)
{
configure_backtrace_handler(get_version());
tor_log_reset_sigsafe_err_fds();
return 0;
}
static void
torerr_subsys_shutdown(void)
{
tor_log_reset_sigsafe_err_fds();
clean_up_backtrace_handler();
}
const subsys_fns_t sys_torerr = {
.name = "err",
.level = -100,
.supported = true,
.initialize = torerr_subsys_init,
.shutdown = torerr_subsys_shutdown
};

14
src/lib/err/torerr_sys.h Normal file
View File

@ -0,0 +1,14 @@
/* Copyright (c) 2018, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file torerr_sys.h
* \brief Declare subsystem object for torerr.c
**/
#ifndef TOR_TORERR_SYS_H
#define TOR_TORERR_SYS_H
extern const struct subsys_fns_t sys_torerr;
#endif /* !defined(TOR_TORERR_SYS_H) */