net: don't crash on Windows when Lookup name has null byte in string
Fixes #31597
Change-Id: I0db1f6f457632c49f9ecfa9d85b99b4cf7d91325
Reviewed-on: https://go-review.googlesource.com/c/go/+/173362
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go
index ed477a7..dd599c7 100644
--- a/src/net/lookup_test.go
+++ b/src/net/lookup_test.go
@@ -1184,3 +1184,13 @@
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 cd071c5..5ebd4b7 100644
--- a/src/net/lookup_windows.go
+++ b/src/net/lookup_windows.go
@@ -101,7 +101,11 @@
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}