From 4fe9dc2fbc29fc57e819874635f09b3f837c0415 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 6 May 2021 11:49:26 +0200 Subject: channel: simplify implementation do not use recover() to prevent writing to a closed channel. There is already a lock, use it as well for Close and let Write check if the channel is still active. [NO TESTS NEEDED] it is a refactoring Signed-off-by: Giuseppe Scrivano --- pkg/channel/writer.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'pkg/channel') diff --git a/pkg/channel/writer.go b/pkg/channel/writer.go index 28c9d7de5..ecb68e906 100644 --- a/pkg/channel/writer.go +++ b/pkg/channel/writer.go @@ -1,7 +1,6 @@ package channel import ( - "fmt" "io" "sync" @@ -34,20 +33,17 @@ func (w *writeCloser) Chan() <-chan []byte { // Write method for WriteCloser func (w *writeCloser) Write(b []byte) (bLen int, err error) { - // https://github.com/containers/podman/issues/7896 - // when podman-remote pull image, if it was killed, the server will panic: send on closed channel - // so handle it - defer func() { - if rErr := recover(); rErr != nil { - err = fmt.Errorf("%s", rErr) - } - }() - if w == nil || w.ch == nil { + if w == nil { return 0, errors.New("use channel.NewWriter() to initialize a WriteCloser") } w.mux.Lock() defer w.mux.Unlock() + + if w.ch == nil { + return 0, errors.New("the channel is closed for Write") + } + buf := make([]byte, len(b)) copy(buf, b) w.ch <- buf @@ -57,6 +53,10 @@ func (w *writeCloser) Write(b []byte) (bLen int, err error) { // Close method for WriteCloser func (w *writeCloser) Close() error { + w.mux.Lock() + defer w.mux.Unlock() + close(w.ch) + w.ch = nil return nil } -- cgit v1.2.3-54-g00ecf