diff options
author | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2023-02-25 16:32:15 +0700 |
---|---|---|
committer | Gopher Robot <gobot@golang.org> | 2023-03-01 18:06:43 +0000 |
commit | d2d0ee2049e78d8c57025e0861425808825c759e (patch) | |
tree | 011f8f5c2d9b4ea7ce20cb252ba3649e6131fb08 | |
parent | 230765a11a9be0aa72a6dc1a8a02bad246514535 (diff) | |
download | go-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.go | 23 |
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 } |