summaryrefslogtreecommitdiff
path: root/libs/pbd/epa.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-04-04 15:25:56 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-04-04 15:25:56 -0400
commit3e7fad52f5035325be02b88baa00be6210e05fe9 (patch)
treed366e28f68aa774184932cabcfe363111deea702 /libs/pbd/epa.cc
parentf7396fd4627509ac378e1229b9d3c311f00ae5cc (diff)
fix conceptual error/thinko in EnvironmentalProtectionAgency when using unsetenv() while iterating over char** environ
Diffstat (limited to 'libs/pbd/epa.cc')
-rw-r--r--libs/pbd/epa.cc21
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());
}
}