]> Cypherpunks repositories - gostls13.git/commitdiff
syscall, internal/syscall/windows: remove utf16PtrToString parameter
authorAlex Brainman <alex.brainman@gmail.com>
Sun, 19 Apr 2020 07:08:58 +0000 (17:08 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Sun, 3 May 2020 07:23:32 +0000 (07:23 +0000)
CL 208617 introduced syscall.utf16PtrToString and
internal/syscall/windows.UTF16PtrToString functions.

Original version of CL 208617 did not include syscall.utf16PtrToString
and internal/syscall/windows.UTF16PtrToString max parameter. The
parameter was added by Brad at the request of Ian. Ian said:

"In some cases it seems at least possible that the null terminator is
not present. I think it would be safer if we passed a maximum length
here."

The syscall.utf16PtrToString and
internal/syscall/windows.UTF16PtrToString function are designed to work
with only null terminated strings. So max parameter is superfluous.

This change removes max parameter.

Updates #34972

Change-Id: Ifea65dbd86bca8a08353579c6b9636c6f963d165
Reviewed-on: https://go-review.googlesource.com/c/go/+/228858
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/go/build/deps_test.go
src/internal/syscall/windows/syscall_windows.go
src/net/interface_windows.go
src/net/lookup_windows.go
src/os/exec_windows.go
src/os/user/lookup_windows.go
src/syscall/security_windows.go
src/syscall/syscall_windows.go

index a5b45fada153cf16fc5b0e7a8bc934bb5d860031..ee1252fda239d0a41cb99f08b8136b65d9cb23da 100644 (file)
@@ -152,7 +152,7 @@ var pkgDeps = map[string][]string{
        "syscall/js":                        {"L0"},
        "internal/oserror":                  {"L0"},
        "internal/syscall/unix":             {"L0", "syscall"},
-       "internal/syscall/windows":          {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"},
+       "internal/syscall/windows":          {"L0", "syscall", "internal/syscall/windows/sysdll", "internal/unsafeheader", "unicode/utf16"},
        "internal/syscall/windows/registry": {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"},
        "internal/syscall/execenv":          {"L0", "syscall", "internal/syscall/windows", "unicode/utf16"},
        "time": {
index f299adc45f3ba4bed17a3f5ce91bb126131277a9..edf0b5a40b8a28fb03976114a864637a85112333 100644 (file)
@@ -5,6 +5,7 @@
 package windows
 
 import (
+       "internal/unsafeheader"
        "sync"
        "syscall"
        "unicode/utf16"
@@ -13,20 +14,24 @@ import (
 
 // UTF16PtrToString is like UTF16ToString, but takes *uint16
 // as a parameter instead of []uint16.
-// max is how many times p can be advanced looking for the null terminator.
-// If max is hit, the string is truncated at that point.
-func UTF16PtrToString(p *uint16, max int) string {
+func UTF16PtrToString(p *uint16) string {
        if p == nil {
                return ""
        }
        // Find NUL terminator.
        end := unsafe.Pointer(p)
        n := 0
-       for *(*uint16)(end) != 0 && n < max {
+       for *(*uint16)(end) != 0 {
                end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
                n++
        }
-       s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n]
+       // Turn *uint16 into []uint16.
+       var s []uint16
+       hdr := (*unsafeheader.Slice)(unsafe.Pointer(&s))
+       hdr.Data = unsafe.Pointer(p)
+       hdr.Cap = n
+       hdr.Len = n
+       // Decode []uint16 into string.
        return string(utf16.Decode(s))
 }
 
index 544943278dc27378c6468d51d3d4ce84f10df0ea..30e90b83c19d3bf8c609550f4bda6410ae8865d4 100644 (file)
@@ -58,7 +58,7 @@ func interfaceTable(ifindex int) ([]Interface, error) {
                if ifindex == 0 || ifindex == int(index) {
                        ifi := Interface{
                                Index: int(index),
-                               Name:  windows.UTF16PtrToString(aa.FriendlyName, 10000),
+                               Name:  windows.UTF16PtrToString(aa.FriendlyName),
                        }
                        if aa.OperStatus == windows.IfOperStatusUp {
                                ifi.Flags |= FlagUp
index 7d5c9419566d8847a007d099005d730543ea7ba2..bb34a081336930dee36c8a6d17e67ded263f9058 100644 (file)
@@ -234,7 +234,7 @@ func (*Resolver) lookupCNAME(ctx context.Context, name string) (string, error) {
        defer syscall.DnsRecordListFree(r, 1)
 
        resolved := resolveCNAME(syscall.StringToUTF16Ptr(name), r)
-       cname := windows.UTF16PtrToString(resolved, 256)
+       cname := windows.UTF16PtrToString(resolved)
        return absDomainName([]byte(cname)), nil
 }
 
@@ -278,7 +278,7 @@ func (*Resolver) lookupMX(ctx context.Context, name string) ([]*MX, error) {
        mxs := make([]*MX, 0, 10)
        for _, p := range validRecs(r, syscall.DNS_TYPE_MX, name) {
                v := (*syscall.DNSMXData)(unsafe.Pointer(&p.Data[0]))
-               mxs = append(mxs, &MX{absDomainName([]byte(windows.UTF16PtrToString(v.NameExchange, 256))), v.Preference})
+               mxs = append(mxs, &MX{absDomainName([]byte(windows.UTF16PtrToString(v.NameExchange))), v.Preference})
        }
        byPref(mxs).sort()
        return mxs, nil
@@ -319,7 +319,7 @@ func (*Resolver) lookupTXT(ctx context.Context, name string) ([]string, error) {
                d := (*syscall.DNSTXTData)(unsafe.Pointer(&p.Data[0]))
                s := ""
                for _, v := range (*[1 << 10]*uint16)(unsafe.Pointer(&(d.StringArray[0])))[:d.StringCount:d.StringCount] {
-                       s += windows.UTF16PtrToString(v, 1<<20)
+                       s += windows.UTF16PtrToString(v)
                }
                txts = append(txts, s)
        }
@@ -344,7 +344,7 @@ func (*Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error)
        ptrs := make([]string, 0, 10)
        for _, p := range validRecs(r, syscall.DNS_TYPE_PTR, arpa) {
                v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
-               ptrs = append(ptrs, absDomainName([]byte(windows.UTF16PtrToString(v.Host, 256))))
+               ptrs = append(ptrs, absDomainName([]byte(windows.UTF16PtrToString(v.Host))))
        }
        return ptrs, nil
 }
index 10503c595ff9713b99c1c5fa5c4736ec0906f5e5..24ddf89bb6a25bf508bd8c712ad17f387b9291c7 100644 (file)
@@ -98,7 +98,7 @@ func findProcess(pid int) (p *Process, err error) {
 }
 
 func init() {
-       cmd := windows.UTF16PtrToString(syscall.GetCommandLine(), 0xffff)
+       cmd := windows.UTF16PtrToString(syscall.GetCommandLine())
        if len(cmd) == 0 {
                arg0, _ := Executable()
                Args = []string{arg0}
index faaddd2341f16ea66519c67fbd8e9b62022cb10a..f65773ced3a36d04ddaca2a1eaa2aeedad580673 100644 (file)
@@ -44,7 +44,7 @@ func lookupFullNameServer(servername, username string) (string, error) {
        }
        defer syscall.NetApiBufferFree(p)
        i := (*syscall.UserInfo10)(unsafe.Pointer(p))
-       return windows.UTF16PtrToString(i.FullName, 1024), nil
+       return windows.UTF16PtrToString(i.FullName), nil
 }
 
 func lookupFullName(domain, username, domainAndUser string) (string, error) {
@@ -167,7 +167,7 @@ func listGroupsForUsernameAndDomain(username, domain string) ([]string, error) {
                if entry.Name == nil {
                        continue
                }
-               sid, err := lookupGroupName(windows.UTF16PtrToString(entry.Name, 1024))
+               sid, err := lookupGroupName(windows.UTF16PtrToString(entry.Name))
                if err != nil {
                        return nil, err
                }
index 3a757596066b3b67e6535b78254393f7c7c14696..67102b69297acc58a85778be8f0cc1c86350f17a 100644 (file)
@@ -163,7 +163,7 @@ func (sid *SID) String() (string, error) {
                return "", e
        }
        defer LocalFree((Handle)(unsafe.Pointer(s)))
-       return utf16PtrToString(s, 256), nil
+       return utf16PtrToString(s), nil
 }
 
 // Len returns the length, in bytes, of a valid security identifier sid.
index 922cf2cb2efdb3c9f98b18b511393c380550b6a5..89c0a930cb6b93f48eef29ac77e7110b632a53ef 100644 (file)
@@ -10,6 +10,7 @@ import (
        errorspkg "errors"
        "internal/oserror"
        "internal/race"
+       "internal/unsafeheader"
        "runtime"
        "sync"
        "unicode/utf16"
@@ -59,20 +60,24 @@ func UTF16ToString(s []uint16) string {
 
 // utf16PtrToString is like UTF16ToString, but takes *uint16
 // as a parameter instead of []uint16.
-// max is how many times p can be advanced looking for the null terminator.
-// If max is hit, the string is truncated at that point.
-func utf16PtrToString(p *uint16, max int) string {
+func utf16PtrToString(p *uint16) string {
        if p == nil {
                return ""
        }
        // Find NUL terminator.
        end := unsafe.Pointer(p)
        n := 0
-       for *(*uint16)(end) != 0 && n < max {
+       for *(*uint16)(end) != 0 {
                end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
                n++
        }
-       s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n]
+       // Turn *uint16 into []uint16.
+       var s []uint16
+       hdr := (*unsafeheader.Slice)(unsafe.Pointer(&s))
+       hdr.Data = unsafe.Pointer(p)
+       hdr.Cap = n
+       hdr.Len = n
+       // Decode []uint16 into string.
        return string(utf16.Decode(s))
 }