Dup stdio FDs for VFS2 when starting a child container

Currently the stdio FDs are not dupped and will be closed
unexpectedly in VFS2 when starting a child container. This
patch fixes this issue.

Fixes: #3821

Signed-off-by: Tiwei Bie <tiwei.btw@antgroup.com>
This commit is contained in:
Tiwei Bie
2020-09-01 15:51:08 +08:00
parent 6748438493
commit 66ee7c0e98
+11 -2
View File
@@ -689,9 +689,18 @@ func (l *Loader) startContainer(spec *specs.Spec, conf *config.Config, cid strin
return fmt.Errorf("creating new process: %v", err)
}
// setupContainerFS() dups stdioFDs, so we don't need to dup them here.
// VFS1 dups stdioFDs, so we don't need to dup them here. VFS2 takes
// ownership of the passed FDs, and we need to dup them here.
for _, f := range files[:3] {
info.stdioFDs = append(info.stdioFDs, int(f.Fd()))
if !kernel.VFS2Enabled {
info.stdioFDs = append(info.stdioFDs, int(f.Fd()))
} else {
fd, err := unix.Dup(int(f.Fd()))
if err != nil {
return fmt.Errorf("failed to dup file: %v", err)
}
info.stdioFDs = append(info.stdioFDs, fd)
}
}
// Can't take ownership away from os.File. dup them to get a new FDs.