From eb0d5dfff1ecec97df71247bfb76748d60a666dc Mon Sep 17 00:00:00 2001 From: Matthew Heon Date: Tue, 3 Apr 2018 18:24:54 -0400 Subject: Prevent a potential race when stopping containers If sending a signal fails, check if the container is alive. If it is not, it probably stopped on its own before we could send the signal, so don't error out. Signed-off-by: Matthew Heon Closes: #591 Approved by: rhatdan --- libpod/oci.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libpod/oci.go b/libpod/oci.go index 049d0817b..b59525de7 100644 --- a/libpod/oci.go +++ b/libpod/oci.go @@ -467,6 +467,15 @@ func (r *OCIRuntime) stopContainer(ctr *Container, timeout uint) error { if timeout > 0 { if err := r.killContainer(ctr, stopSignal); err != nil { + // Is the container gone? + // If so, it probably died between the first check and + // our sending the signal + // The container is stopped, so exit cleanly + err := unix.Kill(ctr.state.PID, 0) + if err == unix.ESRCH { + return nil + } + return err } @@ -479,6 +488,12 @@ func (r *OCIRuntime) stopContainer(ctr *Container, timeout uint) error { } if err := utils.ExecCmdWithStdStreams(os.Stdin, os.Stdout, os.Stderr, r.path, "kill", "--all", ctr.ID(), "KILL"); err != nil { + // Again, check if the container is gone. If it is, exit cleanly. + err := unix.Kill(ctr.state.PID, 0) + if err == unix.ESRCH { + return nil + } + return errors.Wrapf(err, "error sending SIGKILL to container %s", ctr.ID()) } -- cgit v1.2.3-54-g00ecf