summaryrefslogtreecommitdiff
path: root/pkg/api/handlers/compat/containers_attach.go
diff options
context:
space:
mode:
authorMatthew Heon <mheon@redhat.com>2022-04-13 14:04:05 -0400
committerMatthew Heon <mheon@redhat.com>2022-04-13 14:04:05 -0400
commit02b7eeff62224333a6ec768998a6b5db8cd7dc4d (patch)
tree59a4090d2b1cf44e05ba91c6c77a25091aa93ade /pkg/api/handlers/compat/containers_attach.go
parentf6ce14b066ad57a86642f22c15ac42020fc0f660 (diff)
downloadpodman-02b7eeff62224333a6ec768998a6b5db8cd7dc4d.tar.gz
podman-02b7eeff62224333a6ec768998a6b5db8cd7dc4d.tar.bz2
podman-02b7eeff62224333a6ec768998a6b5db8cd7dc4d.zip
Allow HTTP attach to stopped containers
There's a potential race condition where we attempt to attach to a container immediately after it's been stopped, but before the cleanup process has run on it. The existing code doesn't allow an attach to containers in the Stopped state (cleanup process has not run) but does allow an attach to containers in the Exited state (cleanup process has run). This doesn't make very much sense and there's no technical reason to restrict attach to only Exited containers, so allow attaching to Stopped containers. [NO NEW TESTS NEEDED] Testing this is very racy - we need to get in before the cleanup process runs, which isn't really deterministic when we're invoked from a script - like the CI tests. Signed-off-by: Matthew Heon <mheon@redhat.com>
Diffstat (limited to 'pkg/api/handlers/compat/containers_attach.go')
-rw-r--r--pkg/api/handlers/compat/containers_attach.go2
1 files changed, 1 insertions, 1 deletions
diff --git a/pkg/api/handlers/compat/containers_attach.go b/pkg/api/handlers/compat/containers_attach.go
index 027dadaa3..c8905808f 100644
--- a/pkg/api/handlers/compat/containers_attach.go
+++ b/pkg/api/handlers/compat/containers_attach.go
@@ -83,7 +83,7 @@ func AttachContainer(w http.ResponseWriter, r *http.Request) {
return
}
// For Docker compatibility, we need to re-initialize containers in these states.
- if state == define.ContainerStateConfigured || state == define.ContainerStateExited {
+ if state == define.ContainerStateConfigured || state == define.ContainerStateExited || state == define.ContainerStateStopped {
if err := ctr.Init(r.Context(), ctr.PodID() != ""); err != nil {
utils.Error(w, http.StatusConflict, errors.Wrapf(err, "error preparing container %s for attach", ctr.ID()))
return