add missing wait groups for certain io.Pipe() usage (#12264)

wait groups are necessary with io.Pipes() to avoid
races when a blocking function may not be expected
and a Write() -> Close() before Read() races on each
other. We should avoid such situations..

Co-authored-by: Klaus Post <klauspost@gmail.com>
This commit is contained in:
Harshavardhana
2021-05-11 09:18:37 -07:00
committed by GitHub
parent 0b34dfb479
commit e84f533c6c
9 changed files with 113 additions and 40 deletions

View File

@@ -909,9 +909,9 @@ func CleanMinioInternalMetadataKeys(metadata map[string]string) map[string]strin
// client closed the stream prematurely.
func newS2CompressReader(r io.Reader, on int64) io.ReadCloser {
pr, pw := io.Pipe()
comp := s2.NewWriter(pw)
// Copy input to compressor
go func() {
comp := s2.NewWriter(pw)
cn, err := io.Copy(comp, r)
if err != nil {
comp.Close()
@@ -926,12 +926,7 @@ func newS2CompressReader(r io.Reader, on int64) io.ReadCloser {
return
}
// Close the stream.
if err = comp.Close(); err != nil {
pw.CloseWithError(err)
return
}
// Everything ok, do regular close.
pw.Close()
pw.CloseWithError(comp.Close())
}()
return pr
}