diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-04-04 15:25:56 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-04-04 15:25:56 -0400 |
commit | 3e7fad52f5035325be02b88baa00be6210e05fe9 (patch) | |
tree | d366e28f68aa774184932cabcfe363111deea702 | |
parent | f7396fd4627509ac378e1229b9d3c311f00ae5cc (diff) |
fix conceptual error/thinko in EnvironmentalProtectionAgency when using unsetenv() while iterating over char** environ
-rw-r--r-- | libs/pbd/epa.cc | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/libs/pbd/epa.cc b/libs/pbd/epa.cc index c7a1d41b0e..0fc386072f 100644 --- a/libs/pbd/epa.cc +++ b/libs/pbd/epa.cc @@ -131,19 +131,26 @@ EnvironmentalProtectionAgency::restore () const void EnvironmentalProtectionAgency::clear () const { - char** the_environ = environ; + /* Copy the environment before using (g_)unsetenv() because on some + platforms (maybe all?) this directly modifies the environ array, + cause complications for iterating through it. + */ - for (size_t i = 0; the_environ[i]; ++i) { - - string estring = the_environ[i]; - string::size_type equal = estring.find_first_of ('='); + vector<string> ecopy; + + for (size_t i = 0; environ[i]; ++i) { + ecopy.push_back (environ[i]); + } + + for (vector<string>::const_iterator e = ecopy.begin(); e != ecopy.end(); ++e) { + string::size_type equal = (*e).find_first_of ('='); if (equal == string::npos) { /* say what? an environ value without = ? */ continue; } - string before = estring.substr (0, equal); - g_unsetenv(before.c_str()); + string var_name = (*e).substr (0, equal); + g_unsetenv(var_name.c_str()); } } |