Ensure VPNKit process is properly killed when errors occur

The log.Fatal* calls will leak the vpnkit process since
defer functions are not invoked when os.Exit(int) is invoked

We register an ExitHandler with logrus - that'll be invoke when
log.Fatal* is called

Signed-off-by: Steve Hiehn <shiehn@pivotal.io>
Signed-off-by: Dave Protasowski <dprotaso@gmail.com>
This commit is contained in:
Dave Protasowski 2017-12-05 09:48:09 -05:00 committed by Steve Hiehn
parent dcff2008cd
commit c9b4f8306a

View File

@ -240,14 +240,10 @@ func runHyperKit(args []string) {
if err != nil { if err != nil {
log.Fatalln("Unable to start vpnkit: ", err) log.Fatalln("Unable to start vpnkit: ", err)
} }
defer func() { defer shutdownVPNKit(vpnkitProcess)
if vpnkitProcess != nil { log.RegisterExitHandler(func() {
err := vpnkitProcess.Kill() shutdownVPNKit(vpnkitProcess)
if err != nil { })
log.Println(err)
}
}
}()
// The guest will use this 9P mount to configure which ports to forward // The guest will use this 9P mount to configure which ports to forward
h.Sockets9P = []hyperkit.Socket9P{{Path: vpnkitPortSocket, Tag: "port"}} h.Sockets9P = []hyperkit.Socket9P{{Path: vpnkitPortSocket, Tag: "port"}}
// VSOCK port 62373 is used to pass traffic from host->guest // VSOCK port 62373 is used to pass traffic from host->guest
@ -306,6 +302,16 @@ func runHyperKit(args []string) {
} }
} }
func shutdownVPNKit(process *os.Process) {
if process == nil {
return
}
if err := process.Kill(); err != nil {
log.Println(err)
}
}
// createListenSocket creates a new unix domain socket and returns the open file // createListenSocket creates a new unix domain socket and returns the open file
func createListenSocket(path string) (*os.File, error) { func createListenSocket(path string) (*os.File, error) {
os.Remove(path) os.Remove(path)