summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/syscall/env_windows.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/syscall/env_windows.go b/src/syscall/env_windows.go
index 74b154ec15..c311706316 100644
--- a/src/syscall/env_windows.go
+++ b/src/syscall/env_windows.go
@@ -68,21 +68,25 @@ func Clearenv() {
}
func Environ() []string {
- s, e := GetEnvironmentStrings()
+ envp, e := GetEnvironmentStrings()
if e != nil {
return nil
}
- defer FreeEnvironmentStrings(s)
+ defer FreeEnvironmentStrings(envp)
+
r := make([]string, 0, 50) // Empty with room to grow.
- for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(s)); true; i++ {
- if p[i] == 0 {
- // empty string marks the end
- if i <= from {
- break
- }
- r = append(r, string(utf16.Decode(p[from:i])))
- from = i + 1
+ const size = unsafe.Sizeof(*envp)
+ for *envp != 0 { // environment block ends with empty string
+ // find NUL terminator
+ end := unsafe.Pointer(envp)
+ for *(*uint16)(end) != 0 {
+ end = unsafe.Pointer(uintptr(end) + size)
}
+
+ n := (uintptr(end) - uintptr(unsafe.Pointer(envp))) / size
+ entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(envp))[:n:n]
+ r = append(r, string(utf16.Decode(entry)))
+ envp = (*uint16)(unsafe.Pointer(uintptr(end) + size))
}
return r
}