]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: use SOCK_CLOEXEC when creating sockets
authorLorenz Bauer <lmb@cloudflare.com>
Tue, 10 Dec 2019 15:58:24 +0000 (15:58 +0000)
committerIan Lance Taylor <iant@golang.org>
Wed, 11 Dec 2019 00:01:17 +0000 (00:01 +0000)
LsfSocket, SetLsfPromisc and NetlinkRIB currently don't force the CLOEXEC
flag on the sockets they create. While the former two functions are
deprecated, NetlinkRIB is called by various functions related to
net.Interface.

Add a helper to create CLOEXEC sockets, and use it from SetLsfPromisc and
NetlinkRIB. LsfSocket is unchanged since we don't want to break callers.

Fixes #36053

Change-Id: I72fe2b167996797698d8a44b0d28165045c42d3c
Reviewed-on: https://go-review.googlesource.com/c/go/+/210517
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/syscall/lsf_linux.go
src/syscall/netlink_linux.go
src/syscall/sock_cloexec_linux.go [new file with mode: 0644]

index b89239eba8a4576cc60945d59bed9cf27868cc49..28e96d54e6a195ecb57e1d16511eea6fc73b2bfb 100644 (file)
@@ -23,6 +23,8 @@ func LsfJump(code, k, jt, jf int) *SockFilter {
 // Deprecated: Use golang.org/x/net/bpf instead.
 func LsfSocket(ifindex, proto int) (int, error) {
        var lsall SockaddrLinklayer
+       // This is missing SOCK_CLOEXEC, but adding the flag
+       // could break callers.
        s, e := Socket(AF_PACKET, SOCK_RAW, proto)
        if e != nil {
                return 0, e
@@ -46,7 +48,7 @@ type iflags struct {
 
 // Deprecated: Use golang.org/x/net/bpf instead.
 func SetLsfPromisc(name string, m bool) error {
-       s, e := Socket(AF_INET, SOCK_DGRAM, 0)
+       s, e := cloexecSocket(AF_INET, SOCK_DGRAM, 0)
        if e != nil {
                return e
        }
index 1cda8c7704e88a4461306612276ddfbfbaa640a1..0937ff797ad4dcd3ae3323a8a71e1d75c6775d7a 100644 (file)
@@ -50,7 +50,7 @@ func newNetlinkRouteRequest(proto, seq, family int) []byte {
 // NetlinkRIB returns routing information base, as known as RIB, which
 // consists of network facility information, states and parameters.
 func NetlinkRIB(proto, family int) ([]byte, error) {
-       s, err := Socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)
+       s, err := cloexecSocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)
        if err != nil {
                return nil, err
        }
diff --git a/src/syscall/sock_cloexec_linux.go b/src/syscall/sock_cloexec_linux.go
new file mode 100644 (file)
index 0000000..600cf25
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+// This is a stripped down version of sysSocket from net/sock_cloexec.go.
+func cloexecSocket(family, sotype, proto int) (int, error) {
+       s, err := Socket(family, sotype|SOCK_CLOEXEC, proto)
+       switch err {
+       case nil:
+               return s, nil
+       default:
+               return -1, err
+       case EINVAL:
+       }
+
+       ForkLock.RLock()
+       s, err = Socket(family, sotype, proto)
+       if err == nil {
+               CloseOnExec(s)
+       }
+       ForkLock.RUnlock()
+       if err != nil {
+               Close(s)
+               return -1, err
+       }
+       return s, nil
+}