diff options
Diffstat (limited to 'src/os/exec/exec.go')
| -rw-r--r-- | src/os/exec/exec.go | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index d481cf7798..9a9265b667 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -71,6 +71,8 @@ type Cmd struct { // environment. // If Env contains duplicate environment keys, only the last // value in the slice for each duplicate key is used. + // As a special case on Windows, SYSTEMROOT is always added if + // missing and not explicitly set to the empty string. Env []string // Dir specifies the working directory of the command. @@ -412,7 +414,7 @@ func (c *Cmd) Start() error { c.Process, err = os.StartProcess(c.Path, c.argv(), &os.ProcAttr{ Dir: c.Dir, Files: c.childFiles, - Env: dedupEnv(c.envv()), + Env: addCriticalEnv(dedupEnv(c.envv())), Sys: c.SysProcAttr, }) if err != nil { @@ -756,3 +758,24 @@ func dedupEnvCase(caseInsensitive bool, env []string) []string { } return out } + +// addCriticalEnv adds any critical environment variables that are required +// (or at least almost always required) on the operating system. +// Currently this is only used for Windows. +func addCriticalEnv(env []string) []string { + if runtime.GOOS != "windows" { + return env + } + for _, kv := range env { + eq := strings.Index(kv, "=") + if eq < 0 { + continue + } + k := kv[:eq] + if strings.EqualFold(k, "SYSTEMROOT") { + // We already have it. + return env + } + } + return append(env, "SYSTEMROOT="+os.Getenv("SYSTEMROOT")) +} |
