From 483d2573367c185934e52c14ad5d62da66681e28 Mon Sep 17 00:00:00 2001 From: Glonee Date: Sun, 7 Sep 2025 11:25:00 +0800 Subject: [PATCH] http3: fix race in concurrent Transport.RoundTrip calls (#5323) * http3: fix data race in Transport * reset init Once --- http3/transport.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/http3/transport.go b/http3/transport.go index 4085faca..103e9fb5 100644 --- a/http3/transport.go +++ b/http3/transport.go @@ -153,6 +153,13 @@ func (t *Transport) init() error { if t.QUICConfig.MaxIncomingStreams == 0 { t.QUICConfig.MaxIncomingStreams = -1 // don't allow any bidirectional streams } + if t.Dial == nil { + udpConn, err := net.ListenUDP("udp", nil) + if err != nil { + return err + } + t.transport = &quic.Transport{Conn: udpConn} + } return nil } @@ -350,13 +357,6 @@ func (t *Transport) dial(ctx context.Context, hostname string) (*quic.Conn, clie dial := t.Dial if dial == nil { - if t.transport == nil { - udpConn, err := net.ListenUDP("udp", nil) - if err != nil { - return nil, nil, err - } - t.transport = &quic.Transport{Conn: udpConn} - } dial = func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (*quic.Conn, error) { network := "udp" udpAddr, err := t.resolveUDPAddr(ctx, network, addr) @@ -448,6 +448,7 @@ func (t *Transport) Close() error { return err } t.transport = nil + t.initOnce = sync.Once{} } return nil }