Skip to content

Commit 2a915a5

Browse files
committed
fix: vless server close
1 parent 1b0c72b commit 2a915a5

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

adapter/outbound/vless.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -463,26 +463,28 @@ func NewVless(option VlessOption) (*Vless, error) {
463463
if t == s[0] {
464464
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
465465
}
466-
i, err := strconv.Atoi(t)
466+
var i int
467+
i, err = strconv.Atoi(t)
467468
if err != nil {
468469
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
469470
}
470471
minutes = uint32(i)
471472
}
472-
b, err := base64.RawURLEncoding.DecodeString(s[1])
473+
var b []byte
474+
b, err = base64.RawURLEncoding.DecodeString(s[1])
473475
if err != nil {
474476
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
475477
}
476478
if len(b) == 1184 {
477479
v.encryption = &encryption.ClientInstance{}
478-
if err := v.encryption.Init(b, time.Duration(minutes)*time.Minute); err != nil {
480+
if err = v.encryption.Init(b, time.Duration(minutes)*time.Minute); err != nil {
479481
return nil, fmt.Errorf("failed to use mlkem768seed: %w", err)
480482
}
481483
} else {
482484
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
483485
}
484486
if option.Flow != "" {
485-
return nil, errors.New(`VLESS users: "encryption" doesn't support "flow" yet`)
487+
return nil, errors.New(`vless "encryption" doesn't support "flow" yet`)
486488
}
487489
}
488490

listener/sing_vless/server.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,15 @@ func New(config LC.VlessServer, tunnel C.Tunnel, additions ...inbound.Addition)
9595
if t == s[0] {
9696
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
9797
}
98-
i, err := strconv.Atoi(t)
98+
var i int
99+
i, err = strconv.Atoi(t)
99100
if err != nil {
100101
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
101102
}
102103
minutes = uint32(i)
103104
}
104-
b, err := base64.RawURLEncoding.DecodeString(s[1])
105+
var b []byte
106+
b, err = base64.RawURLEncoding.DecodeString(s[1])
105107
if err != nil {
106108
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
107109
}
@@ -113,6 +115,13 @@ func New(config LC.VlessServer, tunnel C.Tunnel, additions ...inbound.Addition)
113115
} else {
114116
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
115117
}
118+
119+
defer func() { // decryption must be closed to avoid the goroutine leak
120+
if err != nil {
121+
_ = sl.decryption.Close()
122+
sl.decryption = nil
123+
}
124+
}()
116125
}
117126

118127
tlsConfig := &tlsC.Config{}
@@ -218,6 +227,9 @@ func (l *Listener) Close() error {
218227
retErr = err
219228
}
220229
}
230+
if l.decryption != nil {
231+
_ = l.decryption.Close()
232+
}
221233
return retErr
222234
}
223235

transport/vless/encryption/server.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type ServerInstance struct {
2727
dKeyNfs *mlkem.DecapsulationKey768
2828
minutes time.Duration
2929
sessions map[[21]byte]*ServerSession
30+
stop bool
3031
}
3132

3233
type ServerConn struct {
@@ -52,6 +53,9 @@ func (i *ServerInstance) Init(dKeyNfsData []byte, minutes time.Duration) (err er
5253
time.Sleep(time.Minute)
5354
now := time.Now()
5455
i.Lock()
56+
if i.stop {
57+
return
58+
}
5559
for index, session := range i.sessions {
5660
if now.After(session.expire) {
5761
delete(i.sessions, index)
@@ -64,6 +68,13 @@ func (i *ServerInstance) Init(dKeyNfsData []byte, minutes time.Duration) (err er
6468
return
6569
}
6670

71+
func (i *ServerInstance) Close() (err error) {
72+
i.Lock()
73+
defer i.Unlock()
74+
i.stop = true
75+
return
76+
}
77+
6778
func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) {
6879
if i.dKeyNfs == nil {
6980
return nil, errors.New("uninitialized")

0 commit comments

Comments
 (0)