X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fcommon%2Fceph_argparse.cc;h=7a2e8ea918232d449eb23827b6b4988f188bb960;hb=b32b81446b3b05102be0267e79203f59329c1d97;hp=355224d0a84f0b975d10a722ed1d036145031207;hpb=215dd7151453fae88e6f968c975b6ce309d42dcf;p=ceph.git diff --git a/ceph/src/common/ceph_argparse.cc b/ceph/src/common/ceph_argparse.cc index 355224d0a..7a2e8ea91 100644 --- a/ceph/src/common/ceph_argparse.cc +++ b/ceph/src/common/ceph_argparse.cc @@ -82,13 +82,20 @@ bool split_dashdash(const std::vector& args, return dashdash; } +static std::mutex g_str_vec_lock; +static vector g_str_vec; + +void clear_g_str_vec() +{ + g_str_vec_lock.lock(); + g_str_vec.clear(); + g_str_vec_lock.unlock(); +} + void env_to_vec(std::vector& args, const char *name) { if (!name) name = "CEPH_ARGS"; - char *p = getenv(name); - if (!p) - return; bool dashdash = false; std::vector options; @@ -98,13 +105,25 @@ void env_to_vec(std::vector& args, const char *name) std::vector env_options; std::vector env_arguments; - static vector str_vec; std::vector env; - str_vec.clear(); - get_str_vec(p, " ", str_vec); - for (vector::iterator i = str_vec.begin(); - i != str_vec.end(); - ++i) + + /* + * We can only populate str_vec once. Other threads could hold pointers into + * it, so clearing it out and replacing it is not currently safe. + */ + g_str_vec_lock.lock(); + if (g_str_vec.empty()) { + char *p = getenv(name); + if (!p) { + g_str_vec_lock.unlock(); + return; + } + get_str_vec(p, " ", g_str_vec); + } + g_str_vec_lock.unlock(); + + vector::iterator i; + for (i = g_str_vec.begin(); i != g_str_vec.end(); ++i) env.push_back(i->c_str()); if (split_dashdash(env, env_options, env_arguments)) dashdash = true;