Browse Source

http2: fix data race on pipe

Fixes golang/go#15999.

Change-Id: I20793ce717c768557c4942ff6be4e77c23ab201c
Reviewed-on: https://go-review.googlesource.com/23880
Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
Mikio Hara 9 năm trước cách đây
mục cha
commit
313cf39d4a
2 tập tin đã thay đổi với 7 bổ sung1 xóa
  1. 6 0
      http2/pipe.go
  2. 1 1
      http2/transport.go

+ 6 - 0
http2/pipe.go

@@ -29,6 +29,12 @@ type pipeBuffer interface {
 	io.Reader
 }
 
+func (p *pipe) Len() int {
+	p.mu.Lock()
+	defer p.mu.Unlock()
+	return p.b.Len()
+}
+
 // Read waits until data is available and copies bytes
 // from the buffer into p.
 func (p *pipe) Read(d []byte) (n int, err error) {

+ 1 - 1
http2/transport.go

@@ -1462,7 +1462,7 @@ func (b transportResponseBody) Read(p []byte) (n int, err error) {
 		// Consider any buffered body data (read from the conn but not
 		// consumed by the client) when computing flow control for this
 		// stream.
-		v := int(cs.inflow.available()) + cs.bufPipe.b.Len()
+		v := int(cs.inflow.available()) + cs.bufPipe.Len()
 		if v < transportDefaultStreamFlow-transportDefaultStreamMinRefresh {
 			streamAdd = int32(transportDefaultStreamFlow - v)
 			cs.inflow.add(streamAdd)