diff options
author | Matthew Heon <mheon@redhat.com> | 2022-06-08 09:27:19 -0400 |
---|---|---|
committer | Matthew Heon <mheon@redhat.com> | 2022-06-14 16:12:10 -0400 |
commit | 8e2faa4faf22916af453e3aa9abd747c7197f01a (patch) | |
tree | 594e63e92c89ddb6802b241d134dbd4b9cc6a340 | |
parent | 8ed9aaba6dbf7190990ce7ba1b190ea9e96f48e4 (diff) | |
download | podman-8e2faa4faf22916af453e3aa9abd747c7197f01a.tar.gz podman-8e2faa4faf22916af453e3aa9abd747c7197f01a.tar.bz2 podman-8e2faa4faf22916af453e3aa9abd747c7197f01a.zip |
Do not error on signalling a just-stopped container
Previous PR #12394 tried to address this, but made a mistake:
containers that have just exited do not move to the Exited state
but rather the Stopped state - as such, the code would never have
run (there is no way we start `podman kill`, and the container
transitions to Exited while we are doing it - that requires
holding the container lock, which Kill already does).
Fix the code to check Stopped as well (we omit Exited entirely
but it's a cheap check and our state logic could change in the
future). Also, return an error, instead of exiting cleanly - the
Kill failed, after all. ErrCtrStateInvalid is already handled by
the sig-proxy logic so there won't be issues.
[NO NEW TESTS NEEDED] This fixes a race that I cannot reproduce
myself, and I have no idea how we'd repro in CI.
Signed-off-by: Matthew Heon <mheon@redhat.com>
-rw-r--r-- | libpod/oci_conmon_linux.go | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/libpod/oci_conmon_linux.go b/libpod/oci_conmon_linux.go index 6aa7ce6dc..0c1ee61d3 100644 --- a/libpod/oci_conmon_linux.go +++ b/libpod/oci_conmon_linux.go @@ -411,8 +411,8 @@ func (r *ConmonOCIRuntime) KillContainer(ctr *Container, signal uint, all bool) if err2 := r.UpdateContainerStatus(ctr); err2 != nil { logrus.Infof("Error updating status for container %s: %v", ctr.ID(), err2) } - if ctr.state.State == define.ContainerStateExited { - return nil + if ctr.ensureState(define.ContainerStateStopped, define.ContainerStateExited) { + return define.ErrCtrStateInvalid } return errors.Wrapf(err, "error sending signal to container %s", ctr.ID()) } |