diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2015-08-03 10:04:42 +0200 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2015-08-03 16:06:17 +0000 |
| commit | 7aa4e29dce2b941644ff1f19e528ccc4790c519e (patch) | |
| tree | 27c98c6c3ea85ec4b04fd3e7c5c2563264c99357 /src/net/http/server.go | |
| parent | 5e15e28e0ed0c70a9c97310d3a7b408cae8f2e23 (diff) | |
| download | go-7aa4e29dce2b941644ff1f19e528ccc4790c519e.tar.xz | |
net/http: fix server/transport data race when sharing the request body
Introduced in https://go-review.googlesource.com/12865 (git rev c2db5f4c).
This fix doesn't add any new lock acquistions: it just moves the
existing one taken by the unreadDataSize method and moves it out
wider.
It became flaky at rev c2db5f4c, but now reliably passes again:
$ go test -v -race -run=TestTransportAndServerSharedBodyRace -count=100 net/http
Fixes #11985
Change-Id: I6956d62839fd7c37e2f7441b1d425793f4a0db30
Reviewed-on: https://go-review.googlesource.com/12909
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/net/http/server.go')
| -rw-r--r-- | src/net/http/server.go | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/net/http/server.go b/src/net/http/server.go index 905a8b9ad8..1b292ea2de 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -880,17 +880,19 @@ func (cw *chunkWriter) writeHeader(p []byte) { discard = true } case *body: + bdy.mu.Lock() switch { case bdy.closed: if !bdy.sawEOF { // Body was closed in handler with non-EOF error. w.closeAfterReply = true } - case bdy.unreadDataSize() >= maxPostHandlerReadBytes: + case bdy.unreadDataSizeLocked() >= maxPostHandlerReadBytes: tooBig = true default: discard = true } + bdy.mu.Unlock() default: discard = true } |
