* environ.cc (build_env): When merging the user's Windows environment,

explicitely skip the variables needing conversion to avoid collisions.
	Extend comment to explain.
This commit is contained in:
Corinna Vinschen 2015-01-14 10:31:14 +00:00
parent f91272b8c2
commit 63716e7d42
2 changed files with 25 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2015-01-14 Corinna Vinschen <corinna@vinschen.de>
* environ.cc (build_env): When merging the user's Windows environment,
explicitely skip the variables needing conversion to avoid collisions.
Extend comment to explain.
2015-01-13 Corinna Vinschen <corinna@vinschen.de> 2015-01-13 Corinna Vinschen <corinna@vinschen.de>
* uinfo.cc (pwdgrp::fetch_account_from_windows): Drop code from * uinfo.cc (pwdgrp::fetch_account_from_windows): Drop code from

View File

@ -1071,9 +1071,11 @@ build_env (const char * const *envp, PWCHAR &envblock, int &envc,
sys_wcstombs_alloc (&winenv[winnum], HEAP_NOTHEAP, var); sys_wcstombs_alloc (&winenv[winnum], HEAP_NOTHEAP, var);
} }
DestroyEnvironmentBlock (cwinenv); DestroyEnvironmentBlock (cwinenv);
/* Eliminate variables which are already available in envp. The windows /* Eliminate variables which are already available in envp, as well as
env is sorted, so we can use bsearch. We're doing this first step, the small set of crucial variables needing POSIX conversion and
so the following code doesn't allocate too much memory. */ potentially collide. The windows env is sorted, so we can use
bsearch. We're doing this first step, so the following code doesn't
allocate too much memory. */
if (winenv) if (winenv)
{ {
for (srcp = envp; *srcp; srcp++) for (srcp = envp; *srcp; srcp++)
@ -1091,6 +1093,20 @@ build_env (const char * const *envp, PWCHAR &envblock, int &envc,
--winnum; --winnum;
} }
} }
for (char **elem = winenv; *elem; elem++)
{
if (match_first_char (*elem, WC))
for (int i = 0; conv_envvars[i].name != NULL; i++)
if (strncmp (*elem, conv_envvars[i].name,
conv_envvars[i].namelen) == 0)
{
free (*elem);
memmove (elem, elem + 1,
(winnum - (elem - winenv)) * sizeof *elem);
--winnum;
--elem;
}
}
} }
} }