diff options
author | Qi Wang <qiwan@redhat.com> | 2020-07-29 10:27:12 -0400 |
---|---|---|
committer | Qi Wang <qiwan@redhat.com> | 2020-07-30 15:32:39 -0400 |
commit | 57967414ae3ff9abaa21da21375c121ecfe47a08 (patch) | |
tree | f6de78943e80c2106c2c77e7a3f7f664d7c49b2b | |
parent | 4132b71478c486b3f4eff6a344ee1b2defbab86f (diff) | |
download | podman-57967414ae3ff9abaa21da21375c121ecfe47a08.tar.gz podman-57967414ae3ff9abaa21da21375c121ecfe47a08.tar.bz2 podman-57967414ae3ff9abaa21da21375c121ecfe47a08.zip |
fix close fds of run --preserve-fds
Test flakes mentioned in #6987 might be caused by uncorrect closing of file descriptor.
Fix the code to close file descriptors for podman run since it may close those used by other processes.
Signed-off-by: Qi Wang <qiwan@redhat.com>
-rw-r--r-- | libpod/oci_conmon_linux.go | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/libpod/oci_conmon_linux.go b/libpod/oci_conmon_linux.go index e677ece31..67593a68b 100644 --- a/libpod/oci_conmon_linux.go +++ b/libpod/oci_conmon_linux.go @@ -954,9 +954,12 @@ func (r *ConmonOCIRuntime) createOCIContainer(ctr *Container, restoreOptions *Co return err } + var filesToClose []*os.File if ctr.config.PreserveFDs > 0 { for fd := 3; fd < int(3+ctr.config.PreserveFDs); fd++ { - cmd.ExtraFiles = append(cmd.ExtraFiles, os.NewFile(uintptr(fd), fmt.Sprintf("fd-%d", fd))) + f := os.NewFile(uintptr(fd), fmt.Sprintf("fd-%d", fd)) + filesToClose = append(filesToClose, f) + cmd.ExtraFiles = append(cmd.ExtraFiles, f) } } @@ -1052,14 +1055,10 @@ func (r *ConmonOCIRuntime) createOCIContainer(ctr *Container, restoreOptions *Co } } - if ctr.config.PreserveFDs > 0 { - for fd := 3; fd < int(3+ctr.config.PreserveFDs); fd++ { - // These fds were passed down to the runtime. Close them - // and not interfere - if err := os.NewFile(uintptr(fd), fmt.Sprintf("fd-%d", fd)).Close(); err != nil { - logrus.Debugf("unable to close file fd-%d", fd) - } - } + // These fds were passed down to the runtime. Close them + // and not interfere + for _, f := range filesToClose { + errorhandling.CloseQuiet(f) } return nil |