From 9a72a7117d5be7f9a38a924b11e15949383544b9 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Thu, 11 Jul 2019 11:41:50 -0700 Subject: [PATCH] Fix potential thread safety issue with zeekenv util function Observed segfault accessing the local static std::map of zeekenv() from a logging thread, but only in non-debug builds using Apple/Clang compiler, not in a debug build or GCC. Don't quite get this behavior since static local variable initialization is supposed to be thread-safe since C++11, but moving to a global static works and is "more efficient" anyway since there's no longer any run-time overhead. --- src/util.cc | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/util.cc b/src/util.cc index 2a6a5c37c4..92062f481c 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1842,24 +1842,24 @@ void bro_strerror_r(int bro_errno, char* buf, size_t buflen) strerror_r_helper(res, buf, buflen); } +static const std::map legacy_vars = { + { "ZEEKPATH", "BROPATH" }, + { "ZEEK_PLUGIN_PATH", "BRO_PLUGIN_PATH" }, + { "ZEEK_PLUGIN_ACTIVATE", "BRO_PLUGIN_ACTIVATE" }, + { "ZEEK_PREFIXES", "BRO_PREFIXES" }, + { "ZEEK_DNS_FAKE", "BRO_DNS_FAKE" }, + { "ZEEK_SEED_FILE", "BRO_SEED_FILE" }, + { "ZEEK_LOG_SUFFIX", "BRO_LOG_SUFFIX" }, + { "ZEEK_PROFILER_FILE", "BRO_PROFILER_FILE" }, + { "ZEEK_DISABLE_ZEEKYGEN", "BRO_DISABLE_BROXYGEN" }, + { "ZEEK_DEFAULT_CONNECT_RETRY", "BRO_DEFAULT_CONNECT_RETRY" }, + { "ZEEK_BROKER_MAX_THREADS", "BRO_BROKER_MAX_THREADS" }, + { "ZEEK_DEFAULT_LISTEN_ADDRESS", "BRO_DEFAULT_LISTEN_ADDRESS" }, + { "ZEEK_DEFAULT_LISTEN_RETRY", "BRO_DEFAULT_LISTEN_RETRY" }, +}; + char* zeekenv(const char* name) { - static std::map legacy_vars = { - { "ZEEKPATH", "BROPATH" }, - { "ZEEK_PLUGIN_PATH", "BRO_PLUGIN_PATH" }, - { "ZEEK_PLUGIN_ACTIVATE", "BRO_PLUGIN_ACTIVATE" }, - { "ZEEK_PREFIXES", "BRO_PREFIXES" }, - { "ZEEK_DNS_FAKE", "BRO_DNS_FAKE" }, - { "ZEEK_SEED_FILE", "BRO_SEED_FILE" }, - { "ZEEK_LOG_SUFFIX", "BRO_LOG_SUFFIX" }, - { "ZEEK_PROFILER_FILE", "BRO_PROFILER_FILE" }, - { "ZEEK_DISABLE_ZEEKYGEN", "BRO_DISABLE_BROXYGEN" }, - { "ZEEK_DEFAULT_CONNECT_RETRY", "BRO_DEFAULT_CONNECT_RETRY" }, - { "ZEEK_BROKER_MAX_THREADS", "BRO_BROKER_MAX_THREADS" }, - { "ZEEK_DEFAULT_LISTEN_ADDRESS", "BRO_DEFAULT_LISTEN_ADDRESS" }, - { "ZEEK_DEFAULT_LISTEN_RETRY", "BRO_DEFAULT_LISTEN_RETRY" }, - }; - auto rval = getenv(name); if ( rval )