net: fix crash of Listen with "" or nil laddr

Fixes #3584.

R=dave, dsymonds, rsc
CC=golang-dev
https://golang.org/cl/6119043
diff --git a/src/pkg/net/ipsock_posix.go b/src/pkg/net/ipsock_posix.go
index ed31319..1718892 100644
--- a/src/pkg/net/ipsock_posix.go
+++ b/src/pkg/net/ipsock_posix.go
@@ -97,10 +97,13 @@
 		return syscall.AF_INET6, true
 	}
 
-	if mode == "listen" && laddr.isWildcard() {
+	if mode == "listen" && (laddr == nil || laddr.isWildcard()) {
 		if supportsIPv4map {
 			return syscall.AF_INET6, false
 		}
+		if laddr == nil {
+			return syscall.AF_INET, false
+		}
 		return laddr.family(), false
 	}
 
diff --git a/src/pkg/net/unicast_test.go b/src/pkg/net/unicast_test.go
index e5dd013..7b3b19b 100644
--- a/src/pkg/net/unicast_test.go
+++ b/src/pkg/net/unicast_test.go
@@ -536,3 +536,33 @@
 		}
 	}
 }
+
+func TestWildWildcardListener(t *testing.T) {
+	switch runtime.GOOS {
+	case "plan9":
+		t.Logf("skipping test on %q", runtime.GOOS)
+		return
+	}
+
+	defer func() {
+		if recover() != nil {
+			t.Fatalf("panicked")
+		}
+	}()
+
+	if ln, err := Listen("tcp", ""); err != nil {
+		ln.Close()
+	}
+	if ln, err := ListenPacket("udp", ""); err != nil {
+		ln.Close()
+	}
+	if ln, err := ListenTCP("tcp", nil); err != nil {
+		ln.Close()
+	}
+	if ln, err := ListenUDP("udp", nil); err != nil {
+		ln.Close()
+	}
+	if ln, err := ListenIP("ip:icmp", nil); err != nil {
+		ln.Close()
+	}
+}