Skip to content

Commit 39ca1b0

Browse files
author
Luca Bruno
authored
Merge pull request #276 from lucab/ups/listeners-always-unset
activation: remove unsafe support for fd re-use
2 parents d1b7d05 + 0c07474 commit 39ca1b0

File tree

6 files changed

+23
-43
lines changed

6 files changed

+23
-43
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ env:
1010
- GOPATH=/opt
1111
- BUILD_DIR=/opt/src/github.com/coreos/go-systemd
1212
matrix:
13-
- DOCKER_BASE=ubuntu:16.04
13+
- DOCKER_BASE=ubuntu:18.04
1414
- DOCKER_BASE=debian:stretch
1515

1616
before_install:

activation/files.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,17 @@ import (
2222
"syscall"
2323
)
2424

25-
// based on: https://gist.github.com/alberts/4640792
2625
const (
26+
// listenFdsStart corresponds to `SD_LISTEN_FDS_START`.
2727
listenFdsStart = 3
2828
)
2929

30+
// Files returns a slice containing a `os.File` object for each
31+
// file descriptor passed to this process via systemd fd-passing protocol.
32+
//
33+
// The order of the file descriptors is preserved in the returned slice.
34+
// `unsetEnv` is typically set to `true` in order to avoid clashes in
35+
// fd usage and to avoid leaking environment flags to child processes.
3036
func Files(unsetEnv bool) []*os.File {
3137
if unsetEnv {
3238
defer os.Unsetenv("LISTEN_PID")

activation/listeners.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,22 @@ import (
2525
// The order of the file descriptors is preserved in the returned slice.
2626
// Nil values are used to fill any gaps. For example if systemd were to return file descriptors
2727
// corresponding with "udp, tcp, tcp", then the slice would contain {nil, net.Listener, net.Listener}
28-
func Listeners(unsetEnv bool) ([]net.Listener, error) {
29-
files := Files(unsetEnv)
28+
func Listeners() ([]net.Listener, error) {
29+
files := Files(true)
3030
listeners := make([]net.Listener, len(files))
3131

3232
for i, f := range files {
3333
if pc, err := net.FileListener(f); err == nil {
3434
listeners[i] = pc
35-
if unsetEnv {
36-
f.Close()
37-
}
35+
f.Close()
3836
}
3937
}
4038
return listeners, nil
4139
}
4240

4341
// ListenersWithNames maps a listener name to a set of net.Listener instances.
44-
func ListenersWithNames(unsetEnv bool) (map[string][]net.Listener, error) {
45-
files := Files(unsetEnv)
42+
func ListenersWithNames() (map[string][]net.Listener, error) {
43+
files := Files(true)
4644
listeners := map[string][]net.Listener{}
4745

4846
for _, f := range files {
@@ -53,9 +51,7 @@ func ListenersWithNames(unsetEnv bool) (map[string][]net.Listener, error) {
5351
} else {
5452
listeners[f.Name()] = append(current, pc)
5553
}
56-
if unsetEnv {
57-
f.Close()
58-
}
54+
f.Close()
5955
}
6056
}
6157
return listeners, nil
@@ -64,8 +60,8 @@ func ListenersWithNames(unsetEnv bool) (map[string][]net.Listener, error) {
6460
// TLSListeners returns a slice containing a net.listener for each matching TCP socket type
6561
// passed to this process.
6662
// It uses default Listeners func and forces TCP sockets handlers to use TLS based on tlsConfig.
67-
func TLSListeners(unsetEnv bool, tlsConfig *tls.Config) ([]net.Listener, error) {
68-
listeners, err := Listeners(unsetEnv)
63+
func TLSListeners(tlsConfig *tls.Config) ([]net.Listener, error) {
64+
listeners, err := Listeners()
6965

7066
if listeners == nil || err != nil {
7167
return nil, err
@@ -85,8 +81,8 @@ func TLSListeners(unsetEnv bool, tlsConfig *tls.Config) ([]net.Listener, error)
8581

8682
// TLSListenersWithNames maps a listener name to a net.Listener with
8783
// the associated TLS configuration.
88-
func TLSListenersWithNames(unsetEnv bool, tlsConfig *tls.Config) (map[string][]net.Listener, error) {
89-
listeners, err := ListenersWithNames(unsetEnv)
84+
func TLSListenersWithNames(tlsConfig *tls.Config) (map[string][]net.Listener, error) {
85+
listeners, err := ListenersWithNames()
9086

9187
if listeners == nil || err != nil {
9288
return nil, err

activation/packetconns.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,14 @@ import (
2424
// The order of the file descriptors is preserved in the returned slice.
2525
// Nil values are used to fill any gaps. For example if systemd were to return file descriptors
2626
// corresponding with "udp, tcp, udp", then the slice would contain {net.PacketConn, nil, net.PacketConn}
27-
func PacketConns(unsetEnv bool) ([]net.PacketConn, error) {
28-
files := Files(unsetEnv)
27+
func PacketConns() ([]net.PacketConn, error) {
28+
files := Files(true)
2929
conns := make([]net.PacketConn, len(files))
3030

3131
for i, f := range files {
3232
if pc, err := net.FilePacketConn(f); err == nil {
3333
conns[i] = pc
34-
if unsetEnv {
35-
f.Close()
36-
}
34+
f.Close()
3735
}
3836
}
3937
return conns, nil

examples/activation/listen.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,7 @@ func fixListenPid() {
3636
func main() {
3737
fixListenPid()
3838

39-
listeners, _ := activation.Listeners(false)
40-
41-
if len(listeners) == 0 {
42-
panic("No listeners")
43-
}
44-
45-
if os.Getenv("LISTEN_PID") == "" || os.Getenv("LISTEN_FDS") == "" || os.Getenv("LISTEN_FDNAMES") == "" {
46-
panic("Should not unset envs")
47-
}
48-
49-
listenersWithNames, err := activation.ListenersWithNames(true)
39+
listenersWithNames, err := activation.ListenersWithNames()
5040
if err != nil {
5141
panic(err)
5242
}

examples/activation/udpconn.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,7 @@ func fixListenPid() {
3737
func main() {
3838
fixListenPid()
3939

40-
pc, _ := activation.PacketConns(false)
41-
42-
if len(pc) == 0 {
43-
panic("No packetConns")
44-
}
45-
46-
if os.Getenv("LISTEN_PID") == "" || os.Getenv("LISTEN_FDS") == "" || os.Getenv("LISTEN_FDNAMES") == "" {
47-
panic("Should not unset envs")
48-
}
49-
50-
pc, err := activation.PacketConns(true)
40+
pc, err := activation.PacketConns()
5141
if err != nil {
5242
panic(err)
5343
}

0 commit comments

Comments
 (0)