mirror of
https://github.com/golang/go.git
synced 2025-05-14 11:54:38 +00:00
syscall, internal/syscall/windows: remove utf16PtrToString parameter
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>
This commit is contained in:
parent
e90b0ce68b
commit
53f27474a4
@ -152,7 +152,7 @@ var pkgDeps = map[string][]string{
|
|||||||
"syscall/js": {"L0"},
|
"syscall/js": {"L0"},
|
||||||
"internal/oserror": {"L0"},
|
"internal/oserror": {"L0"},
|
||||||
"internal/syscall/unix": {"L0", "syscall"},
|
"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/windows/registry": {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"},
|
||||||
"internal/syscall/execenv": {"L0", "syscall", "internal/syscall/windows", "unicode/utf16"},
|
"internal/syscall/execenv": {"L0", "syscall", "internal/syscall/windows", "unicode/utf16"},
|
||||||
"time": {
|
"time": {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
package windows
|
package windows
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"internal/unsafeheader"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unicode/utf16"
|
"unicode/utf16"
|
||||||
@ -13,20 +14,24 @@ import (
|
|||||||
|
|
||||||
// UTF16PtrToString is like UTF16ToString, but takes *uint16
|
// UTF16PtrToString is like UTF16ToString, but takes *uint16
|
||||||
// as a parameter instead of []uint16.
|
// as a parameter instead of []uint16.
|
||||||
// max is how many times p can be advanced looking for the null terminator.
|
func UTF16PtrToString(p *uint16) string {
|
||||||
// If max is hit, the string is truncated at that point.
|
|
||||||
func UTF16PtrToString(p *uint16, max int) string {
|
|
||||||
if p == nil {
|
if p == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
// Find NUL terminator.
|
// Find NUL terminator.
|
||||||
end := unsafe.Pointer(p)
|
end := unsafe.Pointer(p)
|
||||||
n := 0
|
n := 0
|
||||||
for *(*uint16)(end) != 0 && n < max {
|
for *(*uint16)(end) != 0 {
|
||||||
end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
|
end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
|
||||||
n++
|
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))
|
return string(utf16.Decode(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ func interfaceTable(ifindex int) ([]Interface, error) {
|
|||||||
if ifindex == 0 || ifindex == int(index) {
|
if ifindex == 0 || ifindex == int(index) {
|
||||||
ifi := Interface{
|
ifi := Interface{
|
||||||
Index: int(index),
|
Index: int(index),
|
||||||
Name: windows.UTF16PtrToString(aa.FriendlyName, 10000),
|
Name: windows.UTF16PtrToString(aa.FriendlyName),
|
||||||
}
|
}
|
||||||
if aa.OperStatus == windows.IfOperStatusUp {
|
if aa.OperStatus == windows.IfOperStatusUp {
|
||||||
ifi.Flags |= FlagUp
|
ifi.Flags |= FlagUp
|
||||||
|
@ -234,7 +234,7 @@ func (*Resolver) lookupCNAME(ctx context.Context, name string) (string, error) {
|
|||||||
defer syscall.DnsRecordListFree(r, 1)
|
defer syscall.DnsRecordListFree(r, 1)
|
||||||
|
|
||||||
resolved := resolveCNAME(syscall.StringToUTF16Ptr(name), r)
|
resolved := resolveCNAME(syscall.StringToUTF16Ptr(name), r)
|
||||||
cname := windows.UTF16PtrToString(resolved, 256)
|
cname := windows.UTF16PtrToString(resolved)
|
||||||
return absDomainName([]byte(cname)), nil
|
return absDomainName([]byte(cname)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,7 +278,7 @@ func (*Resolver) lookupMX(ctx context.Context, name string) ([]*MX, error) {
|
|||||||
mxs := make([]*MX, 0, 10)
|
mxs := make([]*MX, 0, 10)
|
||||||
for _, p := range validRecs(r, syscall.DNS_TYPE_MX, name) {
|
for _, p := range validRecs(r, syscall.DNS_TYPE_MX, name) {
|
||||||
v := (*syscall.DNSMXData)(unsafe.Pointer(&p.Data[0]))
|
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()
|
byPref(mxs).sort()
|
||||||
return mxs, nil
|
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]))
|
d := (*syscall.DNSTXTData)(unsafe.Pointer(&p.Data[0]))
|
||||||
s := ""
|
s := ""
|
||||||
for _, v := range (*[1 << 10]*uint16)(unsafe.Pointer(&(d.StringArray[0])))[:d.StringCount:d.StringCount] {
|
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)
|
txts = append(txts, s)
|
||||||
}
|
}
|
||||||
@ -344,7 +344,7 @@ func (*Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error)
|
|||||||
ptrs := make([]string, 0, 10)
|
ptrs := make([]string, 0, 10)
|
||||||
for _, p := range validRecs(r, syscall.DNS_TYPE_PTR, arpa) {
|
for _, p := range validRecs(r, syscall.DNS_TYPE_PTR, arpa) {
|
||||||
v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
|
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
|
return ptrs, nil
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ func findProcess(pid int) (p *Process, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cmd := windows.UTF16PtrToString(syscall.GetCommandLine(), 0xffff)
|
cmd := windows.UTF16PtrToString(syscall.GetCommandLine())
|
||||||
if len(cmd) == 0 {
|
if len(cmd) == 0 {
|
||||||
arg0, _ := Executable()
|
arg0, _ := Executable()
|
||||||
Args = []string{arg0}
|
Args = []string{arg0}
|
||||||
|
@ -44,7 +44,7 @@ func lookupFullNameServer(servername, username string) (string, error) {
|
|||||||
}
|
}
|
||||||
defer syscall.NetApiBufferFree(p)
|
defer syscall.NetApiBufferFree(p)
|
||||||
i := (*syscall.UserInfo10)(unsafe.Pointer(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) {
|
func lookupFullName(domain, username, domainAndUser string) (string, error) {
|
||||||
@ -167,7 +167,7 @@ func listGroupsForUsernameAndDomain(username, domain string) ([]string, error) {
|
|||||||
if entry.Name == nil {
|
if entry.Name == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
sid, err := lookupGroupName(windows.UTF16PtrToString(entry.Name, 1024))
|
sid, err := lookupGroupName(windows.UTF16PtrToString(entry.Name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,7 @@ func (sid *SID) String() (string, error) {
|
|||||||
return "", e
|
return "", e
|
||||||
}
|
}
|
||||||
defer LocalFree((Handle)(unsafe.Pointer(s)))
|
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.
|
// Len returns the length, in bytes, of a valid security identifier sid.
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
errorspkg "errors"
|
errorspkg "errors"
|
||||||
"internal/oserror"
|
"internal/oserror"
|
||||||
"internal/race"
|
"internal/race"
|
||||||
|
"internal/unsafeheader"
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"unicode/utf16"
|
"unicode/utf16"
|
||||||
@ -59,20 +60,24 @@ func UTF16ToString(s []uint16) string {
|
|||||||
|
|
||||||
// utf16PtrToString is like UTF16ToString, but takes *uint16
|
// utf16PtrToString is like UTF16ToString, but takes *uint16
|
||||||
// as a parameter instead of []uint16.
|
// as a parameter instead of []uint16.
|
||||||
// max is how many times p can be advanced looking for the null terminator.
|
func utf16PtrToString(p *uint16) string {
|
||||||
// If max is hit, the string is truncated at that point.
|
|
||||||
func utf16PtrToString(p *uint16, max int) string {
|
|
||||||
if p == nil {
|
if p == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
// Find NUL terminator.
|
// Find NUL terminator.
|
||||||
end := unsafe.Pointer(p)
|
end := unsafe.Pointer(p)
|
||||||
n := 0
|
n := 0
|
||||||
for *(*uint16)(end) != 0 && n < max {
|
for *(*uint16)(end) != 0 {
|
||||||
end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
|
end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
|
||||||
n++
|
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))
|
return string(utf16.Decode(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user