fix: vless server close

This commit is contained in:
wwqgtxx 2025-08-10 22:43:31 +08:00
parent 1b0c72bfab
commit 2a915a5c94
3 changed files with 31 additions and 6 deletions

View File

@ -463,26 +463,28 @@ func NewVless(option VlessOption) (*Vless, error) {
if t == s[0] { if t == s[0] {
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption) return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
} }
i, err := strconv.Atoi(t) var i int
i, err = strconv.Atoi(t)
if err != nil { if err != nil {
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption) return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
} }
minutes = uint32(i) minutes = uint32(i)
} }
b, err := base64.RawURLEncoding.DecodeString(s[1]) var b []byte
b, err = base64.RawURLEncoding.DecodeString(s[1])
if err != nil { if err != nil {
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption) return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
} }
if len(b) == 1184 { if len(b) == 1184 {
v.encryption = &encryption.ClientInstance{} v.encryption = &encryption.ClientInstance{}
if err := v.encryption.Init(b, time.Duration(minutes)*time.Minute); err != nil { if err = v.encryption.Init(b, time.Duration(minutes)*time.Minute); err != nil {
return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) return nil, fmt.Errorf("failed to use mlkem768seed: %w", err)
} }
} else { } else {
return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption) return nil, fmt.Errorf("invaild vless encryption value: %s", option.Encryption)
} }
if option.Flow != "" { if option.Flow != "" {
return nil, errors.New(`VLESS users: "encryption" doesn't support "flow" yet`) return nil, errors.New(`vless "encryption" doesn't support "flow" yet`)
} }
} }

View File

@ -95,13 +95,15 @@ func New(config LC.VlessServer, tunnel C.Tunnel, additions ...inbound.Addition)
if t == s[0] { if t == s[0] {
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption) return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
} }
i, err := strconv.Atoi(t) var i int
i, err = strconv.Atoi(t)
if err != nil { if err != nil {
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption) return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
} }
minutes = uint32(i) minutes = uint32(i)
} }
b, err := base64.RawURLEncoding.DecodeString(s[1]) var b []byte
b, err = base64.RawURLEncoding.DecodeString(s[1])
if err != nil { if err != nil {
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption) return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
} }
@ -113,6 +115,13 @@ func New(config LC.VlessServer, tunnel C.Tunnel, additions ...inbound.Addition)
} else { } else {
return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption) return nil, fmt.Errorf("invaild vless decryption value: %s", config.Decryption)
} }
defer func() { // decryption must be closed to avoid the goroutine leak
if err != nil {
_ = sl.decryption.Close()
sl.decryption = nil
}
}()
} }
tlsConfig := &tlsC.Config{} tlsConfig := &tlsC.Config{}
@ -218,6 +227,9 @@ func (l *Listener) Close() error {
retErr = err retErr = err
} }
} }
if l.decryption != nil {
_ = l.decryption.Close()
}
return retErr return retErr
} }

View File

@ -27,6 +27,7 @@ type ServerInstance struct {
dKeyNfs *mlkem.DecapsulationKey768 dKeyNfs *mlkem.DecapsulationKey768
minutes time.Duration minutes time.Duration
sessions map[[21]byte]*ServerSession sessions map[[21]byte]*ServerSession
stop bool
} }
type ServerConn struct { type ServerConn struct {
@ -52,6 +53,9 @@ func (i *ServerInstance) Init(dKeyNfsData []byte, minutes time.Duration) (err er
time.Sleep(time.Minute) time.Sleep(time.Minute)
now := time.Now() now := time.Now()
i.Lock() i.Lock()
if i.stop {
return
}
for index, session := range i.sessions { for index, session := range i.sessions {
if now.After(session.expire) { if now.After(session.expire) {
delete(i.sessions, index) delete(i.sessions, index)
@ -64,6 +68,13 @@ func (i *ServerInstance) Init(dKeyNfsData []byte, minutes time.Duration) (err er
return return
} }
func (i *ServerInstance) Close() (err error) {
i.Lock()
defer i.Unlock()
i.stop = true
return
}
func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) { func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) {
if i.dKeyNfs == nil { if i.dKeyNfs == nil {
return nil, errors.New("uninitialized") return nil, errors.New("uninitialized")