Fix UDP conn stuck on sniff

This change only avoids permanent hangs. We need to implement read deadlines for UDP conns in 1.10 for server inbounds.
This commit is contained in:
世界
2024-08-18 11:27:12 +08:00
parent 34a0281915
commit c8d8c56f87

View File

@@ -951,12 +951,34 @@ func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, m
}*/ }*/
if metadata.InboundOptions.SniffEnabled || metadata.Destination.Addr.IsUnspecified() { if metadata.InboundOptions.SniffEnabled || metadata.Destination.Addr.IsUnspecified() {
buffer := buf.NewPacket() var (
destination, err := conn.ReadPacket(buffer) buffer = buf.NewPacket()
destination M.Socksaddr
done = make(chan struct{})
err error
)
go func() {
sniffTimeout := C.ReadPayloadTimeout
if metadata.InboundOptions.SniffTimeout > 0 {
sniffTimeout = time.Duration(metadata.InboundOptions.SniffTimeout)
}
conn.SetReadDeadline(time.Now().Add(sniffTimeout))
destination, err = conn.ReadPacket(buffer)
conn.SetReadDeadline(time.Time{})
close(done)
}()
select {
case <-done:
case <-ctx.Done():
conn.Close()
return ctx.Err()
}
if err != nil { if err != nil {
buffer.Release() buffer.Release()
if !errors.Is(err, os.ErrDeadlineExceeded) {
return err return err
} }
} else {
if metadata.Destination.Addr.IsUnspecified() { if metadata.Destination.Addr.IsUnspecified() {
metadata.Destination = destination metadata.Destination = destination
} }
@@ -980,6 +1002,7 @@ func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, m
} }
conn = bufio.NewCachedPacketConn(conn, buffer, destination) conn = bufio.NewCachedPacketConn(conn, buffer, destination)
} }
}
if r.dnsReverseMapping != nil && metadata.Domain == "" { if r.dnsReverseMapping != nil && metadata.Domain == "" {
domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr) domain, loaded := r.dnsReverseMapping.Query(metadata.Destination.Addr)
if loaded { if loaded {