diff options
author | SoMuchForSubtlety <jakob@ahrer.dev> | 2021-04-23 00:03:22 +0200 |
---|---|---|
committer | SoMuchForSubtlety <jakob@ahrer.dev> | 2021-04-23 10:14:19 +0200 |
commit | 2df5c6383f6f6ff1f40975450a48abeff57dbd9b (patch) | |
tree | 1356649fc2968afa6ee069cc549fec30f3209a11 /pkg/api | |
parent | 8465626e312a582e434851e6e562974cb3e2e1f8 (diff) | |
download | podman-2df5c6383f6f6ff1f40975450a48abeff57dbd9b.tar.gz podman-2df5c6383f6f6ff1f40975450a48abeff57dbd9b.tar.bz2 podman-2df5c6383f6f6ff1f40975450a48abeff57dbd9b.zip |
Fix removal race condition in ListContainers
It is possible that a container is removed between fetching the
initial list of containers and the second access during conversion.
Closes #10120
[NO TESTS NEEDED]
Signed-off-by: Jakob Ahrer <jakob@ahrer.dev>
Diffstat (limited to 'pkg/api')
-rw-r--r-- | pkg/api/handlers/compat/containers.go | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/pkg/api/handlers/compat/containers.go b/pkg/api/handlers/compat/containers.go index e7146a5d8..d97a4d3bd 100644 --- a/pkg/api/handlers/compat/containers.go +++ b/pkg/api/handlers/compat/containers.go @@ -26,6 +26,7 @@ import ( "github.com/docker/go-units" "github.com/gorilla/schema" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) func RemoveContainer(w http.ResponseWriter, r *http.Request) { @@ -148,14 +149,19 @@ func ListContainers(w http.ResponseWriter, r *http.Request) { containers = containers[:query.Limit] } } - var list = make([]*handlers.Container, len(containers)) - for i, ctnr := range containers { + list := make([]*handlers.Container, 0, len(containers)) + for _, ctnr := range containers { api, err := LibpodToContainer(ctnr, query.Size) if err != nil { + if errors.Cause(err) == define.ErrNoSuchCtr { + // container was removed between the initial fetch of the list and conversion + logrus.Debugf("Container %s removed between initial fetch and conversion, ignoring in output", ctnr.ID()) + continue + } utils.InternalServerError(w, err) return } - list[i] = api + list = append(list, api) } utils.WriteResponse(w, http.StatusOK, list) } |