http2: avoid deadlocks in wrapped ClientConn state callback

An http2.ClientConn wraps an http.ClientConn.
The http.ClientConn calls back to the http2.ClientConn's
state hook on certain state changes.

Since the state hook acquires the http2.ClientConn's mutex,
holding the mutex while calling an http.ClientConn method
which can trigger a state hook call can cause a deadlock.

Avoid deadlocks in two places where the http2.ClientConn
held its mutex while calling http.ClientConn.Reserve.

Fixes golang/go#80680

Change-Id: I9b4107e1461d451cdb2eae7b102bd9ba6a6a6964
Reviewed-on: https://go-review.googlesource.com/c/net/+/808900
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Nicholas Husin <husin@google.com>
Reviewed-by: Nicholas Husin <nsh@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Auto-Submit: Damien Neil <dneil@google.com>
2 files changed
tree: 7e74a3aae5c2582c64dc7a52e61f9d5173cb6612
  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.