Skip to content

Commit ca3a3a2

Browse files
committed
Fix handling of Env on execve
1 parent 01c0cda commit ca3a3a2

File tree

5 files changed

+16
-15
lines changed

5 files changed

+16
-15
lines changed

internal/sema/sema.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,11 +1508,6 @@ func walkCallExpr(e *ast.CallExpr, ctx *ir.EvalContext) ir.MetaExpr {
15081508
case "runtime_args":
15091509
symbol = GetPackageSymbol("runtime", "runtime_args")
15101510
}
1511-
case "syscall":
1512-
switch fn.Name {
1513-
case "runtime_getenv":
1514-
symbol = GetPackageSymbol("runtime", "runtime_getenv")
1515-
}
15161511
case "runtime":
15171512
if fn.Name == "makeSlice1" || fn.Name == "makeSlice8" || fn.Name == "makeSlice16" || fn.Name == "makeSlice24" {
15181513
fn.Name = "makeSlice"

src/os/exec/exec.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,12 @@ func execve(cmds string, args []string) {
9595
argv = append(argv, 0)
9696
argvAddr := uintptr(unsafe.Pointer(&argv[0]))
9797

98+
environ := syscall.Environ()
9899
var envp []uintptr
99-
gopathenvstr := "GOPATH=" + os.Getenv("GOPATH")
100-
gopathenv := append([]byte(gopathenvstr), 0)
101-
envp = append(envp, uintptr(unsafe.Pointer(&gopathenv[0])))
102-
workdirenvstr := "WORKDIR=" + os.Getenv("WORKDIR")
103-
workdirenv := append([]byte(workdirenvstr), 0)
104-
envp = append(envp, uintptr(unsafe.Pointer(&workdirenv[0])))
105-
100+
for _, envLine := range environ {
101+
bufEnvLine := []byte(envLine)
102+
envp = append(envp, uintptr(unsafe.Pointer(&bufEnvLine[0])))
103+
}
106104
envp = append(envp, 0)
107105
envpAddr := uintptr(unsafe.Pointer(&envp[0]))
108106
syscall.Syscall(trap, pathname, argvAddr, envpAddr)

src/os/os.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ func Getenv(key string) string {
172172
return v
173173
}
174174

175+
func Environ() []string {
176+
return syscall.Environ()
177+
}
178+
175179
func Exit(status int) {
176180
syscall.Syscall(uintptr(SYS_EXIT), uintptr(status), 0, 0)
177181
}

src/runtime/runtime.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func mstart0() {
106106

107107
// Environment variables
108108
var envp uintptr
109-
var envlines []string // []{"FOO=BAR\0", "HOME=/home/...\0", ..}
109+
var Envlines []string // []{"FOO=BAR\0", "HOME=/home/...\0", ..}
110110

111111
type EnvEntry struct {
112112
Key string
@@ -136,10 +136,10 @@ func envInit() {
136136
if *bpp == nil {
137137
break
138138
}
139-
envlines = append(envlines, cstring2string(*bpp))
139+
Envlines = append(Envlines, cstring2string(*bpp))
140140
}
141141

142-
for _, envline := range envlines {
142+
for _, envline := range Envlines {
143143
var i int
144144
var c byte
145145
for i, c = range []byte(envline) {

src/syscall/syscall.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ func Getenv(key string) (string, bool) {
2323
return "", false
2424
}
2525

26+
func Environ() []string {
27+
return runtime.Envlines
28+
}
29+
2630
func Read(fd int, buf []byte) (uintptr, error) {
2731
p := &buf[0]
2832
_cap := cap(buf)

0 commit comments

Comments
 (0)