From: Ian Lance Taylor Date: Tue, 6 Jun 2023 17:41:06 +0000 (+0000) Subject: Revert "net: remove fallback path in sysSocket" X-Git-Tag: go1.21rc1~49 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=bd00528d0415a8b8f4ca08e61856e843b7d8672b;p=gostls13.git Revert "net: remove fallback path in sysSocket" This reverts CL 40364. Reason for revert: Fallback path is still required on Solaris. For #45964 For #59359 Change-Id: I4b8c8af77ee987cad6617221793b90c9a8829c3e Reviewed-on: https://go-review.googlesource.com/c/go/+/501276 TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- diff --git a/src/net/sock_cloexec.go b/src/net/sock_cloexec.go index 3f1cc9827a..f4c1165028 100644 --- a/src/net/sock_cloexec.go +++ b/src/net/sock_cloexec.go @@ -10,6 +10,7 @@ package net import ( + "internal/poll" "os" "syscall" ) @@ -18,8 +19,32 @@ import ( // descriptor as nonblocking and close-on-exec. func sysSocket(family, sotype, proto int) (int, error) { s, err := socketFunc(family, sotype|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, proto) + // On Linux the SOCK_NONBLOCK and SOCK_CLOEXEC flags were + // introduced in 2.6.27 kernel and on FreeBSD both flags were + // introduced in 10 kernel. If we get an EINVAL error on Linux + // or EPROTONOSUPPORT error on FreeBSD, fall back to using + // socket without them. + switch err { + case nil: + return s, nil + default: + return -1, os.NewSyscallError("socket", err) + case syscall.EPROTONOSUPPORT, syscall.EINVAL: + } + + // See ../syscall/exec_unix.go for description of ForkLock. + syscall.ForkLock.RLock() + s, err = socketFunc(family, sotype, proto) + if err == nil { + syscall.CloseOnExec(s) + } + syscall.ForkLock.RUnlock() if err != nil { return -1, os.NewSyscallError("socket", err) } + if err = syscall.SetNonblock(s, true); err != nil { + poll.CloseFunc(s) + return -1, os.NewSyscallError("setnonblock", err) + } return s, nil }