fix conceptual error/thinko in EnvironmentalProtectionAgency when using unsetenv() while iterating over char** environ
This commit is contained in:
parent
f7396fd462
commit
3e7fad52f5
@ -131,19 +131,26 @@ EnvironmentalProtectionAgency::restore () const
|
|||||||
void
|
void
|
||||||
EnvironmentalProtectionAgency::clear () const
|
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) {
|
vector<string> ecopy;
|
||||||
|
|
||||||
string estring = the_environ[i];
|
for (size_t i = 0; environ[i]; ++i) {
|
||||||
string::size_type equal = estring.find_first_of ('=');
|
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) {
|
if (equal == string::npos) {
|
||||||
/* say what? an environ value without = ? */
|
/* say what? an environ value without = ? */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
string before = estring.substr (0, equal);
|
string var_name = (*e).substr (0, equal);
|
||||||
g_unsetenv(before.c_str());
|
g_unsetenv(var_name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user