]> Cypherpunks repositories - gostls13.git/commitdiff
net: defend against broken getaddrinfo on Linux
authorRuss Cox <rsc@golang.org>
Wed, 11 Sep 2013 15:38:56 +0000 (11:38 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 11 Sep 2013 15:38:56 +0000 (11:38 -0400)
getaddrinfo is supposed to set errno when it returns
EAI_SYSTEM, but sometimes it does not.

Fixes #6232.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/13532045

src/pkg/net/cgo_unix.go

index 1d736257f52c21a01d247fdefc4dc37b518ef1c8..8397cd70c2ecef51eaa735ed6af3eafed912b0e8 100644 (file)
@@ -99,6 +99,16 @@ func cgoLookupIPCNAME(name string) (addrs []IP, cname string, err error, complet
                if gerrno == C.EAI_NONAME {
                        str = noSuchHost
                } else if gerrno == C.EAI_SYSTEM {
+                       if err == nil {
+                               // err should not be nil, but sometimes getaddrinfo returns
+                               // gerrno == C.EAI_SYSTEM with err == nil on Linux.
+                               // The report claims that it happens when we have too many
+                               // open files, so use syscall.EMFILE (too many open files in system).
+                               // Most system calls would return ENFILE (too many open files),
+                               // so at the least EMFILE should be easy to recognize if this
+                               // comes up again. golang.org/issue/6232.
+                               err = syscall.EMFILE
+                       }
                        str = err.Error()
                } else {
                        str = C.GoString(C.gai_strerror(gerrno))