diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go index ed477a78c9..dd599c7c1c 100644 --- a/src/net/lookup_test.go +++ b/src/net/lookup_test.go @@ -1184,3 +1184,13 @@ func TestWithUnexpiredValuesPreserved(t *testing.T) { t.Errorf("Lookup after expiry: Got %v want nil", g) } } + +// Issue 31586: don't crash on null byte in name +func TestLookupNullByte(t *testing.T) { + testenv.MustHaveExternalNetwork(t) + testenv.SkipFlakyNet(t) + _, err := LookupHost("foo\x00bar") // used to crash on Windows + if err == nil { + t.Errorf("unexpected success") + } +} diff --git a/src/net/lookup_windows.go b/src/net/lookup_windows.go index cd071c54b0..5ebd4b7853 100644 --- a/src/net/lookup_windows.go +++ b/src/net/lookup_windows.go @@ -101,7 +101,11 @@ func (r *Resolver) lookupIP(ctx context.Context, network, name string) ([]IPAddr Protocol: syscall.IPPROTO_IP, } var result *syscall.AddrinfoW - e := syscall.GetAddrInfoW(syscall.StringToUTF16Ptr(name), nil, &hints, &result) + name16p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return nil, &DNSError{Name: name, Err: err.Error()} + } + e := syscall.GetAddrInfoW(name16p, nil, &hints, &result) if e != nil { err := winError("getaddrinfow", e) dnsError := &DNSError{Err: err.Error(), Name: name}