beam: Make extracted Fds CloseOnExec
Grab forklock to make sure no forks accidentally inherit the new fds before they are made CLOEXEC There is a slight race condition between ReadMsgUnix returns and when we grap the lock, so this is not perfect. Unfortunately There is no way to pass MSG_CMSG_CLOEXEC to recvmsg() nor any way to implement non-blocking i/o in go, so this is hard to fix. Docker-DCO-1.1-Signed-off-by: Alexander Larsson <alexl@redhat.com> (github: alexlarsson)
This commit is contained in:
parent
f534839c8b
commit
071e5e5a65
1 changed files with 12 additions and 0 deletions
12
beam/unix.go
12
beam/unix.go
|
@ -148,6 +148,14 @@ func sendUnix(conn *net.UnixConn, data []byte, fds ...int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractFds(oob []byte) (fds []int) {
|
func extractFds(oob []byte) (fds []int) {
|
||||||
|
// Grab forklock to make sure no forks accidentally inherit the new
|
||||||
|
// fds before they are made CLOEXEC
|
||||||
|
// There is a slight race condition between ReadMsgUnix returns and
|
||||||
|
// when we grap the lock, so this is not perfect. Unfortunately
|
||||||
|
// There is no way to pass MSG_CMSG_CLOEXEC to recvmsg() nor any
|
||||||
|
// way to implement non-blocking i/o in go, so this is hard to fix.
|
||||||
|
syscall.ForkLock.Lock()
|
||||||
|
defer syscall.ForkLock.Unlock()
|
||||||
scms, err := syscall.ParseSocketControlMessage(oob)
|
scms, err := syscall.ParseSocketControlMessage(oob)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -158,6 +166,10 @@ func extractFds(oob []byte) (fds []int) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
fds = append(fds, gotFds...)
|
fds = append(fds, gotFds...)
|
||||||
|
|
||||||
|
for _, fd := range fds {
|
||||||
|
syscall.CloseOnExec(fd)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue