summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuseppe Scrivano <gscrivan@redhat.com>2021-05-06 11:49:26 +0200
committerGiuseppe Scrivano <gscrivan@redhat.com>2021-05-06 11:51:15 +0200
commit4fe9dc2fbc29fc57e819874635f09b3f837c0415 (patch)
tree1d7cc51b2e69f32356082455d177ccc40ee7f48b
parent9b9bd9e0e7b72c91d8e60103e8da7999cefbc63d (diff)
downloadpodman-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>
-rw-r--r--pkg/channel/writer.go20
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
}