diff options
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index cec3c2069b..8c5cf903ba 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -906,6 +906,36 @@ static int compareenv(const void *a, const void *b) return strcasecmp(*ea, *eb); } +/* + * Create environment block suitable for CreateProcess. + */ +static wchar_t *make_environment_block(char **env) +{ + wchar_t *wenvblk = NULL; + int count = 0; + char **e, **tmpenv; + int size = 0, wenvsz = 0, wenvpos = 0; + + for (e = env; *e; e++) + count++; + + /* environment must be sorted */ + tmpenv = xmalloc(sizeof(*tmpenv) * (count + 1)); + memcpy(tmpenv, env, sizeof(*tmpenv) * (count + 1)); + qsort(tmpenv, count, sizeof(*tmpenv), compareenv); + + /* create environment block from temporary environment */ + for (e = tmpenv; *e; e++) { + size = 2 * strlen(*e) + 2; /* +2 for final \0 */ + ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz); + wenvpos += xutftowcs(&wenvblk[wenvpos], *e, size) + 1; + } + /* add final \0 terminator */ + wenvblk[wenvpos] = 0; + free(tmpenv); + return wenvblk; +} + struct pinfo_t { struct pinfo_t *next; pid_t pid; @@ -982,29 +1012,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, xutftowcs(wargs, args.buf, 2 * args.len + 1); strbuf_release(&args); - if (env) { - int count = 0; - char **e, **sorted_env; - int size = 0, wenvsz = 0, wenvpos = 0; - - for (e = env; *e; e++) - count++; - - /* environment must be sorted */ - sorted_env = xmalloc(sizeof(*sorted_env) * (count + 1)); - memcpy(sorted_env, env, sizeof(*sorted_env) * (count + 1)); - qsort(sorted_env, count, sizeof(*sorted_env), compareenv); - - /* create environment block from temporary environment */ - for (e = sorted_env; *e; e++) { - size = 2 * strlen(*e) + 2; /* +2 for final \0 */ - ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz); - wenvpos += xutftowcs(&wenvblk[wenvpos], *e, size) + 1; - } - /* add final \0 terminator */ - wenvblk[wenvpos] = 0; - free(sorted_env); - } + if (env) + wenvblk = make_environment_block(env); memset(&pi, 0, sizeof(pi)); ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags, |