src/internal/syscall/windows/registry/key.go | 12 ++++++++++-- src/internal/syscall/windows/registry/value.go | 6 +++++- src/net/lookup_test.go | 1 + src/net/lookup_windows.go | 19 ++++++++++++++++--- src/syscall/syscall_windows.go | 6 +++++- diff --git a/src/internal/syscall/windows/registry/key.go b/src/internal/syscall/windows/registry/key.go index b95fa8d3326e39bff771415f94084ae250096d54..768967ddcfbe57fe786e8dbb34c2a43a36274efa 100644 --- a/src/internal/syscall/windows/registry/key.go +++ b/src/internal/syscall/windows/registry/key.go @@ -132,7 +132,11 @@ // to be created. func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { var h syscall.Handle var d uint32 - err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), + pathp, err := syscall.UTF16PtrFromString(path) + if err != nil { + return 0, false, err + } + err = regCreateKeyEx(syscall.Handle(k), pathp, 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) if err != nil { return 0, false, err @@ -142,7 +146,11 @@ } // DeleteKey deletes the subkey path of key k and its values. func DeleteKey(k Key, path string) error { - return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) + pathp, err := syscall.UTF16PtrFromString(path) + if err != nil { + return err + } + return regDeleteKey(syscall.Handle(k), pathp) } // A KeyInfo describes the statistics of a key. It is returned by Stat. diff --git a/src/internal/syscall/windows/registry/value.go b/src/internal/syscall/windows/registry/value.go index 67b1144eae586f3ceb9bb5bfea3fa71563078604..e267616a8119f9a215add9522410b63f2ba4a3ce 100644 --- a/src/internal/syscall/windows/registry/value.go +++ b/src/internal/syscall/windows/registry/value.go @@ -333,7 +333,11 @@ } // DeleteValue removes a named value from the key k. func (k Key) DeleteValue(name string) error { - return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) + namep, err := syscall.UTF16PtrFromString(name) + if err != nil { + return err + } + return regDeleteValue(syscall.Handle(k), namep) } // ReadValueNames returns the value names of key k. diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go index 514cbd098ae772a1628c72545fadd72b227c754b..b9a33aca01affbe237ce0cdfff17dd36e135a578 100644 --- a/src/net/lookup_test.go +++ b/src/net/lookup_test.go @@ -769,6 +769,7 @@ {"tcp", "65536", 0, false}, {"udp", "-1", 0, false}, {"udp", "65536", 0, false}, {"tcp", "123456789", 0, false}, + {"tcp", "bad\x00port", 0, false}, // Issue 13610: LookupPort("tcp", "") {"tcp", "", 0, true}, diff --git a/src/net/lookup_windows.go b/src/net/lookup_windows.go index 38034dc6014c9309d9cde5500a5da84ebd6b0c23..9af20bbb2bc1b008fb84b04e70fbfc4b23062b88 100644 --- a/src/net/lookup_windows.go +++ b/src/net/lookup_windows.go @@ -215,8 +215,13 @@ case '6': hints.Family = syscall.AF_INET6 } + servicep, err := syscall.UTF16PtrFromString(service) + if err != nil { + return 0, newDNSError(err, network+"/"+service, "") + } + var result *syscall.AddrinfoW - e := syscall.GetAddrInfoW(nil, syscall.StringToUTF16Ptr(service), &hints, &result) + e := syscall.GetAddrInfoW(nil, servicep, &hints, &result) if e != nil { if port, err := lookupPortMap(network, service); err == nil { return port, nil @@ -269,7 +274,12 @@ return "", newDNSError(winError("dnsquery", e), name, "") } defer syscall.DnsRecordListFree(rec, 1) - resolved := resolveCNAME(syscall.StringToUTF16Ptr(name), rec) + namep, err := syscall.UTF16PtrFromString(name) + if err != nil { + return "", newDNSError(err, name, "") + } + + resolved := resolveCNAME(namep, rec) cname := windows.UTF16PtrToString(resolved) return absDomainName(cname), nil } @@ -415,7 +425,10 @@ const dnsSectionMask = 0x0003 // returns only results applicable to name and resolves CNAME entries. func validRecs(r *syscall.DNSRecord, dnstype uint16, name string) []*syscall.DNSRecord { - cname := syscall.StringToUTF16Ptr(name) + cname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return nil + } if dnstype != syscall.DNS_TYPE_CNAME { cname = resolveCNAME(cname, r) } diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index 01c039cf2870476efc53554d561e9b09cc988526..87f42f01b7b61df55e09e1ff9d64e043d26d1bba 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -1357,7 +1357,11 @@ } // Readlink returns the destination of the named symbolic link. func Readlink(path string, buf []byte) (n int, err error) { - fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING, + pathp, err := UTF16PtrFromString(path) + if err != nil { + return -1, err + } + fd, err := CreateFile(pathp, GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0) if err != nil { return -1, err