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.
This commit is contained in:
Jon Siwek 2019-07-11 11:41:50 -07:00
parent 0d34a1c646
commit 9a72a7117d

View file

@ -1842,9 +1842,7 @@ void bro_strerror_r(int bro_errno, char* buf, size_t buflen)
strerror_r_helper(res, buf, buflen);
}
char* zeekenv(const char* name)
{
static std::map<const char*, const char*, CompareString> legacy_vars = {
static const std::map<const char*, const char*, CompareString> legacy_vars = {
{ "ZEEKPATH", "BROPATH" },
{ "ZEEK_PLUGIN_PATH", "BRO_PLUGIN_PATH" },
{ "ZEEK_PLUGIN_ACTIVATE", "BRO_PLUGIN_ACTIVATE" },
@ -1858,8 +1856,10 @@ char* zeekenv(const char* name)
{ "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)
{
auto rval = getenv(name);
if ( rval )