// 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
// 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
}
// 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
}
--- /dev/null
+// 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
+}