Fix improper cleanup when creating a unix socket

k3s-v1.15.3
Renaud Gaubert 2019-05-30 09:23:00 -07:00
parent 39aeaac90e
commit a03d2d4d4e
1 changed files with 25 additions and 1 deletions

View File

@ -20,6 +20,7 @@ package util
import ( import (
"fmt" "fmt"
"io/ioutil"
"net" "net"
"net/url" "net/url"
"os" "os"
@ -51,7 +52,30 @@ func CreateListener(endpoint string) (net.Listener, error) {
return nil, fmt.Errorf("failed to unlink socket file %q: %v", addr, err) return nil, fmt.Errorf("failed to unlink socket file %q: %v", addr, err)
} }
return net.Listen(protocol, addr) if err := os.MkdirAll(filepath.Dir(addr), 0750); err != nil {
return nil, fmt.Errorf("error creating socket directory %q: %v", filepath.Dir(addr), err)
}
// Create the socket on a tempfile and move it to the destination socket to handle improprer cleanup
file, err := ioutil.TempFile(filepath.Dir(addr), "")
if err != nil {
return nil, fmt.Errorf("failed to create temporary file: %v", err)
}
if err := os.Remove(file.Name()); err != nil {
return nil, fmt.Errorf("failed to remove temporary file: %v", err)
}
l, err := net.Listen(protocol, file.Name())
if err != nil {
return nil, err
}
if err = os.Rename(file.Name(), addr); err != nil {
return nil, fmt.Errorf("failed to move temporary file to addr %q: %v", addr, err)
}
return l, nil
} }
// GetAddressAndDialer returns the address parsed from the given endpoint and a dialer. // GetAddressAndDialer returns the address parsed from the given endpoint and a dialer.