aboutsummaryrefslogtreecommitdiff
path: root/src/os/exec/exec.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/exec/exec.go')
-rw-r--r--src/os/exec/exec.go25
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"))
+}