]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.20] syscall: fix invalid unsafe.Pointer conversion on Windows
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Sat, 25 Feb 2023 09:32:15 +0000 (16:32 +0700)
committerGopher Robot <gobot@golang.org>
Wed, 1 Mar 2023 18:06:43 +0000 (18:06 +0000)
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>

src/syscall/env_windows.go

index cd085a9e44732caddb362c46d2a149378733c521..94364f930c6fe41ba1269514c4ac409871e30f33 100644 (file)
@@ -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
 }