Freedom UDP: Fix some cone uses like STUN,... when address is domain (#4942)

https://github.com/XTLS/Xray-core/issues/2962#issuecomment-3120472154
This commit is contained in:
patterniha 2025-07-26 03:59:15 +02:00 committed by GitHub
parent 1ea00fad81
commit 10376f5b4d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -285,14 +285,18 @@ func NewPacketReader(conn net.Conn, UDPOverride net.Destination, DialDest net.De
counter = statConn.ReadCounter counter = statConn.ReadCounter
} }
if c, ok := iConn.(*internet.PacketConnWrapper); ok { if c, ok := iConn.(*internet.PacketConnWrapper); ok {
isAddrChanged := false isOverridden := false
if UDPOverride.Address != nil || UDPOverride.Port != 0 || DialDest.Address.Family().IsDomain() { if UDPOverride.Address != nil || UDPOverride.Port != 0 {
isAddrChanged = true isOverridden = true
} }
changedAddress, _, _ := net.SplitHostPort(conn.RemoteAddr().String())
return &PacketReader{ return &PacketReader{
PacketConnWrapper: c, PacketConnWrapper: c,
Counter: counter, Counter: counter,
IsAddrChanged: isAddrChanged, IsOverridden: isOverridden,
InitUnchangedAddr: DialDest.Address,
InitChangedAddr: net.ParseAddress(changedAddress),
} }
} }
return &buf.PacketReader{Reader: conn} return &buf.PacketReader{Reader: conn}
@ -301,7 +305,9 @@ func NewPacketReader(conn net.Conn, UDPOverride net.Destination, DialDest net.De
type PacketReader struct { type PacketReader struct {
*internet.PacketConnWrapper *internet.PacketConnWrapper
stats.Counter stats.Counter
IsAddrChanged bool IsOverridden bool
InitUnchangedAddr net.Address
InitChangedAddr net.Address
} }
func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
@ -315,9 +321,13 @@ func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
b.Resize(0, int32(n)) b.Resize(0, int32(n))
// if udp dest addr is changed, we are unable to get the correct src addr // if udp dest addr is changed, we are unable to get the correct src addr
// so we don't attach src info to udp packet, break cone behavior, assuming the dial dest is the expected scr addr // so we don't attach src info to udp packet, break cone behavior, assuming the dial dest is the expected scr addr
if !r.IsAddrChanged { if !r.IsOverridden {
address := net.IPAddress(d.(*net.UDPAddr).IP)
if r.InitChangedAddr == address {
address = r.InitUnchangedAddr
}
b.UDP = &net.Destination{ b.UDP = &net.Destination{
Address: net.IPAddress(d.(*net.UDPAddr).IP), Address: address,
Port: net.Port(d.(*net.UDPAddr).Port), Port: net.Port(d.(*net.UDPAddr).Port),
Network: net.Network_UDP, Network: net.Network_UDP,
} }