From fc2f5758cf22fe5d3d46be7e4642abc0735e2c8d Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Mon, 11 Nov 2013 21:58:40 -0600 Subject: [PATCH] fix container restart race condition Finish container cleanup before setting the state to stopped. Otherwise, for an application that exits quickly, a call to Restart can allow Start to be called again before cleanup is done, resulting in overritten data in the Container struct. --- container.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/container.go b/container.go index 9dac345447..16f45cb490 100644 --- a/container.go +++ b/container.go @@ -1287,9 +1287,6 @@ func (container *Container) monitor() { exitCode = container.cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() } - // Report status back - container.State.setStopped(exitCode) - if container.runtime != nil && container.runtime.srv != nil { container.runtime.srv.LogEvent("die", container.ID, container.runtime.repositories.ImageName(container.Image)) } @@ -1302,6 +1299,9 @@ func (container *Container) monitor() { container.stdin, container.stdinPipe = io.Pipe() } + // Report status back + container.State.setStopped(exitCode) + // Release the lock close(container.waitLock)