mirror of
https://github.com/golang/go
synced 2024-11-24 21:40:09 -07:00
runtime: do not share underlying envs/argv array
Removes a potential data race between os.Setenv and runtime.GOROOT, along with a bug where os.Setenv would only sometimes change the value of runtime.GOROOT. Change-Id: I7d2a905115c667ea6e73f349f3784a1d3e8f810d Reviewed-on: https://go-review.googlesource.com/6611 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
ac080fa6d8
commit
402f71a839
41
src/runtime/env_test.go
Normal file
41
src/runtime/env_test.go
Normal file
@ -0,0 +1,41 @@
|
||||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package runtime_test
|
||||
|
||||
import (
|
||||
"runtime"
|
||||
"syscall"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestFixedGOROOT(t *testing.T) {
|
||||
if runtime.GOOS == "plan9" {
|
||||
t.Skipf("skipping plan9, it is inconsistent by allowing GOROOT to be updated by Setenv")
|
||||
}
|
||||
|
||||
envs := runtime.Envs()
|
||||
oldenvs := append([]string{}, envs...)
|
||||
defer runtime.SetEnvs(oldenvs)
|
||||
|
||||
// attempt to reuse existing envs backing array.
|
||||
want := runtime.GOROOT()
|
||||
runtime.SetEnvs(append(envs[:0], "GOROOT="+want))
|
||||
|
||||
if got := runtime.GOROOT(); got != want {
|
||||
t.Errorf(`initial runtime.GOROOT()=%q, want %q`, got, want)
|
||||
}
|
||||
if err := syscall.Setenv("GOROOT", "/os"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got := runtime.GOROOT(); got != want {
|
||||
t.Errorf(`after setenv runtime.GOROOT()=%q, want %q`, got, want)
|
||||
}
|
||||
if err := syscall.Unsetenv("GOROOT"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got := runtime.GOROOT(); got != want {
|
||||
t.Errorf(`after unsetenv runtime.GOROOT()=%q, want %q`, got, want)
|
||||
}
|
||||
}
|
@ -122,3 +122,6 @@ var Open = open
|
||||
var Close = close
|
||||
var Read = read
|
||||
var Write = write
|
||||
|
||||
func Envs() []string { return envs }
|
||||
func SetEnvs(e []string) { envs = e }
|
||||
|
@ -47,7 +47,7 @@ var envs []string
|
||||
var argslice []string
|
||||
|
||||
//go:linkname syscall_runtime_envs syscall.runtime_envs
|
||||
func syscall_runtime_envs() []string { return envs }
|
||||
func syscall_runtime_envs() []string { return append([]string{}, envs...) }
|
||||
|
||||
//go:linkname os_runtime_args os.runtime_args
|
||||
func os_runtime_args() []string { return argslice }
|
||||
func os_runtime_args() []string { return append([]string{}, argslice...) }
|
||||
|
Loading…
Reference in New Issue
Block a user