fix: dialer dual stack panic

This commit is contained in:
gVisor bot 2023-03-10 20:16:14 +08:00
parent 3d83eeba87
commit cbacbd7407

View file

@ -182,16 +182,8 @@ func dualStackDialContext(ctx context.Context, dialFn dialFunc, network string,
go racer(ipv6s, preferIPVersion != 4) go racer(ipv6s, preferIPVersion != 4)
var fallback dialResult var fallback dialResult
var errs []error var errs []error
for { for i := 0; i < 2; i++ {
select { select {
case <-ctx.Done():
if fallback.error == nil && fallback.Conn != nil {
return fallback.Conn, nil
}
if res, ok := <-results; ok && res.error == nil {
return res.Conn, nil
}
return nil, errorsJoin(errs...)
case <-fallbackTicker.C: case <-fallbackTicker.C:
if fallback.error == nil && fallback.Conn != nil { if fallback.error == nil && fallback.Conn != nil {
return fallback.Conn, nil return fallback.Conn, nil
@ -211,6 +203,10 @@ func dualStackDialContext(ctx context.Context, dialFn dialFunc, network string,
} }
} }
} }
if fallback.error == nil && fallback.Conn != nil {
return fallback.Conn, nil
}
return nil, errorsJoin(errs...)
} }
func parallelDialContext(ctx context.Context, network string, ips []netip.Addr, port string, opt *option) (net.Conn, error) { func parallelDialContext(ctx context.Context, network string, ips []netip.Addr, port string, opt *option) (net.Conn, error) {