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}