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
@@ -240,14 +240,10 @@ func runHyperKit(args []string) {
if err != nil {
log.Fatalln("Unable to start vpnkit: ", err)
}
- defer func() {
- if vpnkitProcess != nil {
- err := vpnkitProcess.Kill()
- if err != nil {
- log.Println(err)
- }
- }
- }()
+ defer shutdownVPNKit(vpnkitProcess)
+ log.RegisterExitHandler(func() {
+ shutdownVPNKit(vpnkitProcess)
+ })
// The guest will use this 9P mount to configure which ports to forward
h.Sockets9P = []hyperkit.Socket9P{{Path: vpnkitPortSocket, Tag: "port"}}
// 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
func createListenSocket(path string) (*os.File, error) {
os.Remove(path)
