From 26a5cf9efa8d0fc4ffbf2f9810241d4fdead8e16 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sun, 28 Aug 2016 21:00:18 +0200 Subject: [PATCH] vm: fix potential deadlock in OutputMerger --- vm/merger.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/vm/merger.go b/vm/merger.go index b19326ef..2effd0f4 100644 --- a/vm/merger.go +++ b/vm/merger.go @@ -41,9 +41,12 @@ func (merger *OutputMerger) Add(r io.ReadCloser) { if merger.tee != nil { merger.tee.Write(out) } - merger.Output <- append([]byte{}, out...) - r := copy(pending[:], pending[pos+1:]) - pending = pending[:r] + select { + case merger.Output <- append([]byte{}, out...): + r := copy(pending[:], pending[pos+1:]) + pending = pending[:r] + default: + } } } if err != nil { @@ -52,7 +55,10 @@ func (merger *OutputMerger) Add(r io.ReadCloser) { if merger.tee != nil { merger.tee.Write(pending) } - merger.Output <- pending + select { + case merger.Output <- pending: + default: + } } r.Close() merger.wg.Done()