aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorFazlul Shahriar <fshahriar@gmail.com>2019-10-21 12:18:27 -0400
committerBrad Fitzpatrick <bradfitz@golang.org>2019-10-23 20:13:18 +0000
commitb284dac23250a2c0ad941d6e20de7d54ffa13253 (patch)
tree37b3c3aa346911fe481b25d5d48809de6c71c7e7 /src/syscall
parent7833302a6258a65bc17526b54347601df5ff1c5e (diff)
downloadgo-b284dac23250a2c0ad941d6e20de7d54ffa13253.tar.xz
syscall: fix Clearenv on Plan 9
Update #25234 Fixes #35083 Change-Id: Ida39516ab1c14a34a62c2232476a75e83f4e3f75 Reviewed-on: https://go-review.googlesource.com/c/go/+/202657 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/env_plan9.go16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/syscall/env_plan9.go b/src/syscall/env_plan9.go
index 9a8a837e7d..e403a25e31 100644
--- a/src/syscall/env_plan9.go
+++ b/src/syscall/env_plan9.go
@@ -74,7 +74,21 @@ func Setenv(key, value string) error {
}
func Clearenv() {
- RawSyscall(SYS_RFORK, RFCENVG, 0, 0)
+ // Creating a new environment group using rfork(RFCENVG) can race
+ // with access to files in /env (e.g. from Setenv or Getenv).
+ // Remove all environment variables in current environment group instead.
+ fd, err := open("/env", O_RDONLY)
+ if err != nil {
+ return
+ }
+ defer Close(fd)
+ files, err := readdirnames(fd)
+ if err != nil {
+ return
+ }
+ for _, key := range files {
+ Remove("/env/" + key)
+ }
}
func Unsetenv(key string) error {