Skip to content

Commit

Permalink
runtime: copy env strings on startup
Browse files Browse the repository at this point in the history
Some versions of libc, in this case Android's bionic, point environ
directly at the envp memory.

https://android.googlesource.com/platform/bionic/+/master/libc/bionic/libc_init_common.cpp#104

The Go runtime does something surprisingly similar, building the
runtime's envs []string using gostringnocopy. Both libc and the Go
runtime reusing memory interacts badly. When syscall.Setenv uses cgo
to call setenv(3), C modifies the underlying memory of a Go string.

This manifests on android/arm. With GOROOT=/data/local/tmp, a
runtime test calls syscall.Setenv("/os"), resulting in
runtime.GOROOT()=="/os\x00a/local/tmp/goroot".

Avoid this by copying environment string memory into Go.

Covered by runtime.TestFixedGOROOT on android/arm.

Change-Id: Id0cf9553969f587addd462f2239dafca1cf371fa
Reviewed-on: https://go-review.googlesource.com/7663
Reviewed-by: Keith Randall <[email protected]>
  • Loading branch information
crawshaw committed Mar 17, 2015
1 parent 00c73f5 commit ce9b512
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/runtime/runtime1.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func goenvs_unix() {

envs = make([]string, n)
for i := int32(0); i < n; i++ {
envs[i] = gostringnocopy(argv_index(argv, argc+1+i))
envs[i] = gostring(argv_index(argv, argc+1+i))
}
}

Expand Down

0 comments on commit ce9b512

Please sign in to comment.