From 744db3ff88c903951b229f28b3c32aff73815df7 Mon Sep 17 00:00:00 2001 From: criyle Date: Tue, 14 Jul 2020 00:12:12 -0700 Subject: [PATCH] Do not close read pipe after limit --- pkg/pipe/buffer.go | 6 ++++-- pkg/pipe/discard.go | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 pkg/pipe/discard.go diff --git a/pkg/pipe/buffer.go b/pkg/pipe/buffer.go index 2a37475..2ffb366 100644 --- a/pkg/pipe/buffer.go +++ b/pkg/pipe/buffer.go @@ -28,9 +28,11 @@ func NewPipe(writer io.Writer, n int64) (<-chan struct{}, *os.File, error) { } done := make(chan struct{}) go func() { - defer close(done) - defer r.Close() io.CopyN(writer, r, int64(n)) + close(done) + // ensure no blocking / SIGPIPE on the other end + discardRead(r) + r.Close() }() return done, w, nil } diff --git a/pkg/pipe/discard.go b/pkg/pipe/discard.go new file mode 100644 index 0000000..6f0d814 --- /dev/null +++ b/pkg/pipe/discard.go @@ -0,0 +1,19 @@ +package pipe + +import ( + "io" + "os" +) + +var _ io.Writer = discardWriter{} + +type discardWriter struct { +} + +func (w discardWriter) Write(b []byte) (int, error) { + return len(b), nil +} + +func discardRead(f *os.File) (int64, error) { + return io.Copy(discardWriter{}, f) +}