]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix crash of Listen with "" or nil laddr
authorMikio Hara <mikioh.mikioh@gmail.com>
Wed, 25 Apr 2012 03:29:14 +0000 (12:29 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Wed, 25 Apr 2012 03:29:14 +0000 (12:29 +0900)
Fixes #3584.

R=dave, dsymonds, rsc
CC=golang-dev
https://golang.org/cl/6119043

src/pkg/net/ipsock_posix.go
src/pkg/net/unicast_test.go

index ed313195c97fae98f99cb1cf2e22a0d003355294..171889207d7661b1a0cc4f7ee6f8db95b69b1723 100644 (file)
@@ -97,10 +97,13 @@ func favoriteAddrFamily(net string, laddr, raddr sockaddr, mode string) (family
                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
        }
 
index e5dd013db670c9985419194ea38ee11acd7681d8..7b3b19b3237cbad9b80a29ff72dfafdb39bf3e1d 100644 (file)
@@ -536,3 +536,33 @@ func TestProhibitionaryDialArgs(t *testing.T) {
                }
        }
 }
+
+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()
+       }
+}