From 5df282efcf9ca9349dc56084fa60ce1e10019cf0 Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Wed, 2 Oct 2019 09:59:28 -0700 Subject: [PATCH] transport: fix race between operateHeaders and closeStream and reading headers (#3062) headerChan isn't necessarily closed when closeStream returns; block on it in waitOnHeader. --- internal/transport/transport.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/transport/transport.go b/internal/transport/transport.go index 965c76f1..87189e4f 100644 --- a/internal/transport/transport.go +++ b/internal/transport/transport.go @@ -320,6 +320,9 @@ func (s *Stream) waitOnHeader() { // this function returns. err := ContextErr(s.ctx.Err()) s.ct.closeStream(s, err, false, 0, status.Convert(err), nil, false) + // headerChan could possibly not be closed yet if closeStream raced + // with operateHeaders; wait until it is closed explicitly here. + <-s.headerChan case <-s.headerChan: } }