internal/http3: avoid data race for roundTripState.reqBody

There is currently a data race because roundTripState.reqBody is
written in writeBodyAndTrailer, which might execute concurrently with
closeReqBody that reads roundTripState.reqBody.

To avoid the data race, initialize roundTripState.reqBody early. This
ensures that the roundTripState is no longer going to be written to by
the time that it is given as part of a transportResponseBody, whose
Close method uses closeReqBody.

The test for this behavior is in std. This data race was found as part
of running net/http test against x/net/internal/http3.

For golang/go#70914

Change-Id: I9c97007bea4883e93c2075d1f1b48c356a6a6964
Reviewed-on: https://go-review.googlesource.com/c/net/+/765520
Reviewed-by: Nicholas Husin <husin@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Nicholas Husin <husin@google.com>
1 file changed
tree: 6b4db6bce801be75a0f7bfed3f5e5853a9c93c7d
  1. bpf/
  2. context/
  3. dict/
  4. dns/
  5. html/
  6. http/
  7. http2/
  8. http3/
  9. icmp/
  10. idna/
  11. internal/
  12. ipv4/
  13. ipv6/
  14. lif/
  15. nettest/
  16. netutil/
  17. proxy/
  18. publicsuffix/
  19. quic/
  20. route/
  21. trace/
  22. webdav/
  23. websocket/
  24. xsrftoken/
  25. .gitattributes
  26. .gitignore
  27. codereview.cfg
  28. CONTRIBUTING.md
  29. go.mod
  30. go.sum
  31. LICENSE
  32. PATENTS
  33. README.md
README.md

Go Networking

Go Reference

This repository holds supplementary Go networking packages.

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://go.dev/doc/contribute.

The git repository is https://go.googlesource.com/net.

The main issue tracker for the net repository is located at https://go.dev/issues. Prefix your issue with “x/net:” in the subject line, so it is easy to find.