diff --git a/libcontainer/container_linux.go b/libcontainer/container_linux.go index 9f0043fb..6b65accf 100644 --- a/libcontainer/container_linux.go +++ b/libcontainer/container_linux.go @@ -191,17 +191,29 @@ func (c *linuxContainer) Start(process *Process) error { if err != nil { return err } - return c.start(process, status == Stopped) + if status == Stopped { + if err := c.createExecFifo(); err != nil { + return err + } + } + if err := c.start(process, status == Stopped); err != nil { + if status == Stopped { + c.deleteExecFifo() + } + return err + } + return nil } func (c *linuxContainer) Run(process *Process) error { c.m.Lock() - defer c.m.Unlock() status, err := c.currentStatus() if err != nil { + c.m.Unlock() return err } - if err := c.start(process, status == Stopped); err != nil { + c.m.Unlock() + if err := c.Start(process); err != nil { return err } if status == Stopped { @@ -291,6 +303,37 @@ func (c *linuxContainer) Signal(s os.Signal, all bool) error { return nil } +func (c *linuxContainer) createExecFifo() error { + rootuid, err := c.Config().HostUID() + if err != nil { + return err + } + rootgid, err := c.Config().HostGID() + if err != nil { + return err + } + + fifoName := filepath.Join(c.root, execFifoFilename) + if _, err := os.Stat(fifoName); err == nil { + return fmt.Errorf("exec fifo %s already exists", fifoName) + } + oldMask := syscall.Umask(0000) + if err := syscall.Mkfifo(fifoName, 0622); err != nil { + syscall.Umask(oldMask) + return err + } + syscall.Umask(oldMask) + if err := os.Chown(fifoName, rootuid, rootgid); err != nil { + return err + } + return nil +} + +func (c *linuxContainer) deleteExecFifo() { + fifoName := filepath.Join(c.root, execFifoFilename) + os.Remove(fifoName) +} + func (c *linuxContainer) newParentProcess(p *Process, doInit bool) (parentProcess, error) { parentPipe, childPipe, err := newPipe() if err != nil { diff --git a/libcontainer/factory_linux.go b/libcontainer/factory_linux.go index 16235501..7f044bd4 100644 --- a/libcontainer/factory_linux.go +++ b/libcontainer/factory_linux.go @@ -169,16 +169,6 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err if err := os.Chown(containerRoot, uid, gid); err != nil { return nil, newGenericError(err, SystemError) } - fifoName := filepath.Join(containerRoot, execFifoFilename) - oldMask := syscall.Umask(0000) - if err := syscall.Mkfifo(fifoName, 0622); err != nil { - syscall.Umask(oldMask) - return nil, newGenericError(err, SystemError) - } - syscall.Umask(oldMask) - if err := os.Chown(fifoName, uid, gid); err != nil { - return nil, newGenericError(err, SystemError) - } c := &linuxContainer{ id: id, root: containerRoot,