Skip to content

Commit

Permalink
Do not create exec fifo in factory.Create
Browse files Browse the repository at this point in the history
It should not be binded to container creation, for
example, runc restore needs to create a
libcontainer.Container, but it won't need exec fifo.

So create exec fifo when container is started or run,
where we really need it.

Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
  • Loading branch information
hqhq committed Feb 22, 2017
1 parent 3293874 commit 805b8c7
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 13 deletions.
49 changes: 46 additions & 3 deletions libcontainer/container_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
10 changes: 0 additions & 10 deletions libcontainer/factory_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 805b8c7

Please sign in to comment.