diff options
author | Giuseppe Scrivano <gscrivan@redhat.com> | 2021-05-06 11:49:26 +0200 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2021-05-06 11:51:15 +0200 |
commit | 4fe9dc2fbc29fc57e819874635f09b3f837c0415 (patch) | |
tree | 1d7cc51b2e69f32356082455d177ccc40ee7f48b /pkg/channel/writer.go | |
parent | 9b9bd9e0e7b72c91d8e60103e8da7999cefbc63d (diff) | |
download | podman-4fe9dc2fbc29fc57e819874635f09b3f837c0415.tar.gz podman-4fe9dc2fbc29fc57e819874635f09b3f837c0415.tar.bz2 podman-4fe9dc2fbc29fc57e819874635f09b3f837c0415.zip |
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 <gscrivan@redhat.com>
Diffstat (limited to 'pkg/channel/writer.go')
-rw-r--r-- | pkg/channel/writer.go | 20 |
1 files changed, 10 insertions, 10 deletions
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 } |