summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2023-02-25 16:32:15 +0700
committerGopher Robot <gobot@golang.org>2023-03-01 18:06:43 +0000
commitd2d0ee2049e78d8c57025e0861425808825c759e (patch)
tree011f8f5c2d9b4ea7ce20cb252ba3649e6131fb08
parent230765a11a9be0aa72a6dc1a8a02bad246514535 (diff)
downloadgo-git-d2d0ee2049e78d8c57025e0861425808825c759e.tar.gz
[release-branch.go1.20] syscall: fix invalid unsafe.Pointer conversion on Windows
Updates #58714 Fixes #58774 Change-Id: Ifa5c059ed5e358ed98aee7e83b95dd1806b535f7 Reviewed-on: https://go-review.googlesource.com/c/go/+/471335 Reviewed-by: Than McIntosh <thanm@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Bryan Mills <bcmills@google.com> (cherry picked from commit de8c999159bb72e8a43f9b38b6369fc43eca572e) Reviewed-on: https://go-review.googlesource.com/c/go/+/471599 Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Auto-Submit: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Run-TryBot: Bryan Mills <bcmills@google.com>
-rw-r--r--src/syscall/env_windows.go23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/syscall/env_windows.go b/src/syscall/env_windows.go
index cd085a9e44..94364f930c 100644
--- a/src/syscall/env_windows.go
+++ b/src/syscall/env_windows.go
@@ -74,21 +74,24 @@ 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.Add(end, size)
}
+
+ entry := unsafe.Slice(envp, (uintptr(end)-uintptr(unsafe.Pointer(envp)))/size)
+ r = append(r, string(utf16.Decode(entry)))
+ envp = (*uint16)(unsafe.Add(end, size))
}
return r
}