]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1] syscall: workaround accept() bug on Darwin
authorAlexey Borzenkov <snaury@gmail.com>
Fri, 21 Sep 2012 19:54:18 +0000 (05:54 +1000)
committerAndrew Gerrand <adg@golang.org>
Fri, 21 Sep 2012 19:54:18 +0000 (05:54 +1000)
««« backport 0eae95b0307a
syscall: workaround accept() bug on Darwin

Darwin kernels have a bug in accept() where error result from
an internal call is not checked and socket is accepted instead
of ECONNABORTED error. However, such sockets have no sockaddr,
which results in EAFNOSUPPORT error from anyToSockaddr, making
Go http servers running on Mac OS X easily susceptible to
denial of service from simple port scans with nmap.
Fixes #3849.

R=golang-dev, adg, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/6456045

»»»

src/pkg/syscall/syscall_bsd.go

index c1a822aa17a04437262334710824ff4754f1a5bd..1d873b69ac4816020937a499f7054106e3fd225c 100644 (file)
@@ -304,6 +304,14 @@ func Accept(fd int) (nfd int, sa Sockaddr, err error) {
        if err != nil {
                return
        }
+       if len == 0 {
+               // Accepted socket has no address.
+               // This is likely due to a bug in xnu kernels,
+               // where instead of ECONNABORTED error socket
+               // is accepted, but has no address.
+               Close(nfd)
+               return 0, nil, ECONNABORTED
+       }
        sa, err = anyToSockaddr(&rsa)
        if err != nil {
                Close(nfd)