From 35aa63ea874f249d9c1b84250aa3f5aef960b3e7 Mon Sep 17 00:00:00 2001 From: lifubang Date: Sun, 14 Jan 2024 12:54:32 +0800 Subject: [PATCH] never send procError after the socket closed Signed-off-by: lifubang --- libcontainer/init_linux.go | 6 +++++- libcontainer/sync_unix.go | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libcontainer/init_linux.go b/libcontainer/init_linux.go index 0117ace59..85be7cc41 100644 --- a/libcontainer/init_linux.go +++ b/libcontainer/init_linux.go @@ -107,7 +107,11 @@ func startInitialization() (retErr error) { defer func() { // If this defer is ever called, this means initialization has failed. - // Send the error back to the parent process in the form of an initError. + // Send the error back to the parent process in the form of an initError + // if the sync socket has not been closed. + if syncPipe.isClosed() { + return + } ierr := initError{Message: retErr.Error()} if err := writeSyncArg(syncPipe, procError, ierr); err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/libcontainer/sync_unix.go b/libcontainer/sync_unix.go index f94486cb3..c5d8f55ec 100644 --- a/libcontainer/sync_unix.go +++ b/libcontainer/sync_unix.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "os" + "sync/atomic" "golang.org/x/sys/unix" ) @@ -14,7 +15,8 @@ import ( // which ends up making things like json.Decoder hang forever if the packet is // bigger than the internal read buffer. type syncSocket struct { - f *os.File + f *os.File + closed atomic.Bool } func newSyncSocket(f *os.File) *syncSocket { @@ -26,9 +28,15 @@ func (s *syncSocket) File() *os.File { } func (s *syncSocket) Close() error { + // Even with errors from Close(), we have to assume the pipe was closed. + s.closed.Store(true) return s.f.Close() } +func (s *syncSocket) isClosed() bool { + return s.closed.Load() +} + func (s *syncSocket) WritePacket(b []byte) (int, error) { return s.f.Write(b) }