Skip to content

Commit ad2e4cb

Browse files
LjhAUMEMRPRX
authored andcommitted
Finalmask: Fix unexpected order and UDP's buf issue (#6331)
XTLS/Xray-docs-next#866 (comment) And #6331 (comment) Fixes #6184 (comment)
1 parent 829d54d commit ad2e4cb

2 files changed

Lines changed: 17 additions & 13 deletions

File tree

infra/conf/transport_internet.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,12 +1788,15 @@ func (c *MkcpLegacy) Build() (proto.Message, error) {
17881788
}
17891789

17901790
type Salamander struct {
1791-
Password string `json:"password"`
1792-
PacketSize *Int32Range `json:"packetSize"`
1791+
Password string `json:"password"`
1792+
PacketSize Int32Range `json:"packetSize"`
17931793
}
17941794

17951795
func (c *Salamander) Build() (proto.Message, error) {
1796-
if c.PacketSize != nil {
1796+
if c.PacketSize.To > 0 {
1797+
if c.PacketSize.From <= 0 || c.PacketSize.To > 2048 {
1798+
return nil, errors.New("gecko: invalid min/max packet size")
1799+
}
17971800
return &salamander.GeckoConfig{
17981801
Password: c.Password,
17991802
MinPacketSize: c.PacketSize.From,

transport/internet/finalmask/finalmask.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package finalmask
33
import (
44
"context"
55
"net"
6+
"slices"
67

78
"github.com/xtls/xray-core/common/buf"
89
"github.com/xtls/xray-core/common/errors"
@@ -28,7 +29,7 @@ func NewUdpmaskManager(udpmasks []Udpmask) *UdpmaskManager {
2829
func (m *UdpmaskManager) WrapPacketConnClient(raw net.PacketConn) (net.PacketConn, error) {
2930
var sizes []int
3031
var conns []net.PacketConn
31-
for i, mask := range m.udpmasks {
32+
for i, mask := range slices.Backward(m.udpmasks) {
3233
if _, ok := mask.(headerConn); ok {
3334
conn, err := mask.WrapPacketConnClient(nil, i, len(m.udpmasks)-1)
3435
if err != nil {
@@ -61,7 +62,7 @@ func (m *UdpmaskManager) WrapPacketConnClient(raw net.PacketConn) (net.PacketCon
6162
func (m *UdpmaskManager) WrapPacketConnServer(raw net.PacketConn) (net.PacketConn, error) {
6263
var sizes []int
6364
var conns []net.PacketConn
64-
for i, mask := range m.udpmasks {
65+
for i, mask := range slices.Backward(m.udpmasks) {
6566
if _, ok := mask.(headerConn); ok {
6667
conn, err := mask.WrapPacketConnServer(nil, i, len(m.udpmasks)-1)
6768
if err != nil {
@@ -124,32 +125,32 @@ func (c *headerManagerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)
124125
if err != nil {
125126
return n, addr, err
126127
}
127-
b = b[:n]
128+
buf := b[:n]
128129

129130
sum := 0
130131
for _, size := range c.sizes {
131132
sum += size
132133
}
133134

134135
if n < sum {
135-
errors.LogError(context.Background(), "[mask] drop packet from ", addr, " with size ", len(b))
136+
errors.LogError(context.Background(), "[mask] drop packet from ", addr, " with size ", n)
136137
continue
137138
}
138139

139140
for i := range c.conns {
140-
n, _, err = c.conns[i].ReadFrom(b)
141+
n, _, err = c.conns[i].ReadFrom(buf)
141142
if err != nil {
142-
errors.LogErrorInner(context.Background(), err, "[mask] drop packet from ", addr, " with size ", len(b))
143+
errors.LogErrorInner(context.Background(), err, "[mask] drop packet from ", addr, " with size ", n)
143144
break
144145
}
145-
b = b[c.sizes[i] : n+c.sizes[i]]
146+
buf = buf[c.sizes[i] : n+c.sizes[i]]
146147
}
147148

148149
if err != nil {
149150
continue
150151
}
151152

152-
return copy(p, b), addr, nil
153+
return copy(p, buf), addr, nil
153154
}
154155
}
155156

@@ -212,7 +213,7 @@ func NewTcpmaskManager(tcpmasks []Tcpmask) *TcpmaskManager {
212213

213214
func (m *TcpmaskManager) WrapConnClient(raw net.Conn) (net.Conn, error) {
214215
var err error
215-
for _, mask := range m.tcpmasks {
216+
for _, mask := range slices.Backward(m.tcpmasks) {
216217
raw, err = mask.WrapConnClient(raw)
217218
if err != nil {
218219
return nil, err
@@ -223,7 +224,7 @@ func (m *TcpmaskManager) WrapConnClient(raw net.Conn) (net.Conn, error) {
223224

224225
func (m *TcpmaskManager) WrapConnServer(raw net.Conn) (net.Conn, error) {
225226
var err error
226-
for _, mask := range m.tcpmasks {
227+
for _, mask := range slices.Backward(m.tcpmasks) {
227228
raw, err = mask.WrapConnServer(raw)
228229
if err != nil {
229230
return nil, err

0 commit comments

Comments
 (0)