diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-02-13 02:50:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-13 02:50:41 +0100 |
commit | 5ea6cad20c9659da9bae38a660da584ee2b58aec (patch) | |
tree | bd13b0c8eee495352a271e49b519a6193aef92ae | |
parent | c16e12f6c51e03dd950cbe4b9ac3bb92519fef71 (diff) | |
parent | 5b69e7f2ef3ad0bd73ad6ec4d24c033da6456ef2 (diff) | |
download | podman-5ea6cad20c9659da9bae38a660da584ee2b58aec.tar.gz podman-5ea6cad20c9659da9bae38a660da584ee2b58aec.tar.bz2 podman-5ea6cad20c9659da9bae38a660da584ee2b58aec.zip |
Merge pull request #5183 from giuseppe/rootlessport-avoid-hang
rootlessport: fix potential hang
-rw-r--r-- | pkg/rootlessport/rootlessport_linux.go | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/pkg/rootlessport/rootlessport_linux.go b/pkg/rootlessport/rootlessport_linux.go index 3e678d33a..2b51f4e09 100644 --- a/pkg/rootlessport/rootlessport_linux.go +++ b/pkg/rootlessport/rootlessport_linux.go @@ -122,6 +122,7 @@ func parent() error { logrus.WithError(driverErr).Warn("parent driver exited") } errCh <- driverErr + close(errCh) }() opaque := driver.OpaqueForChild() logrus.Infof("opaque=%+v", opaque) @@ -142,15 +143,12 @@ func parent() error { }() // reexec the child process in the child netns - cmd := exec.Command(fmt.Sprintf("/proc/%d/exe", os.Getpid())) + cmd := exec.Command("/proc/self/exe") cmd.Args = []string{reexecChildKey} cmd.Stdin = childQuitR cmd.Stdout = &logrusWriter{prefix: "child"} cmd.Stderr = cmd.Stdout cmd.Env = append(os.Environ(), reexecChildEnvOpaque+"="+string(opaqueJSON)) - cmd.SysProcAttr = &syscall.SysProcAttr{ - Pdeathsig: syscall.SIGTERM, - } childNS, err := ns.GetNS(cfg.NetNSPath) if err != nil { return err @@ -162,14 +160,27 @@ func parent() error { return err } + defer func() { + if err := syscall.Kill(cmd.Process.Pid, syscall.SIGTERM); err != nil { + logrus.WithError(err).Warn("kill child process") + } + }() + logrus.Info("waiting for initComplete") // wait for the child to connect to the parent - select { - case <-initComplete: - logrus.Infof("initComplete is closed; parent and child established the communication channel") - case err := <-errCh: - return err +outer: + for { + select { + case <-initComplete: + logrus.Infof("initComplete is closed; parent and child established the communication channel") + break outer + case err := <-errCh: + if err != nil { + return err + } + } } + defer func() { logrus.Info("stopping parent driver") quit <- struct{}{} |