From b2684c18573508394bed07199152e5eda6f1d6ff Mon Sep 17 00:00:00 2001 From: "dmytro.iakovliev" Date: Mon, 8 Feb 2021 12:57:00 +0200 Subject: [PATCH] Fix for lack of syncromization in daemon/update.go Signed-off-by: dmytro.iakovliev (cherry picked from commit 58825ffc3243f13795b36f430726ae8e3e14bed0) Signed-off-by: Sebastiaan van Stijn --- daemon/update.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/daemon/update.go b/daemon/update.go index ce2376a24875d..65ea6885e6b48 100644 --- a/daemon/update.go +++ b/daemon/update.go @@ -42,20 +42,25 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro restoreConfig := false backupHostConfig := *ctr.HostConfig + defer func() { if restoreConfig { ctr.Lock() - ctr.HostConfig = &backupHostConfig - ctr.CheckpointTo(daemon.containersReplica) + if !ctr.RemovalInProgress && !ctr.Dead { + ctr.HostConfig = &backupHostConfig + ctr.CheckpointTo(daemon.containersReplica) + } ctr.Unlock() } }() + ctr.Lock() + if ctr.RemovalInProgress || ctr.Dead { + ctr.Unlock() return errCannotUpdate(ctr.ID, fmt.Errorf("container is marked for removal and cannot be \"update\"")) } - ctr.Lock() if err := ctr.UpdateContainer(hostConfig); err != nil { restoreConfig = true ctr.Unlock() @@ -66,6 +71,7 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro ctr.Unlock() return errCannotUpdate(ctr.ID, err) } + ctr.Unlock() // if Restart Policy changed, we need to update container monitor