Skip to content

Commit fbb80bb

Browse files
FanglidingExclude0122
authored andcommitted
Hysteria transport: Fix client-side clientManager (XTLS#5928)
Fixes XTLS#5911
1 parent c5b57da commit fbb80bb

2 files changed

Lines changed: 31 additions & 21 deletions

File tree

proxy/hysteria/server.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
9494
useremail = inbound.User.Email
9595
userlevel = inbound.User.Level
9696
}
97+
} else {
98+
// get a dummy user
99+
inbound.User = &protocol.MemoryUser{
100+
Email: "",
101+
Level: 0,
102+
}
97103
}
98104

99105
if _, ok := iConn.(*hysteria.InterUdpConn); ok {

transport/internet/hysteria/dialer.go

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,13 @@ func (c *client) udphopDialer(addr *net.UDPAddr) (net.PacketConn, error) {
421421
return pktConn, nil
422422
}
423423

424+
type dialerConf struct {
425+
net.Destination
426+
*internet.MemoryStreamConfig
427+
}
428+
424429
type clientManager struct {
425-
m map[string]*client
430+
m map[dialerConf]*client
426431
mutex sync.Mutex
427432
}
428433

@@ -435,7 +440,8 @@ func (m *clientManager) clean() {
435440
}
436441
}
437442

438-
var manger *clientManager
443+
var manager *clientManager
444+
var initmanager sync.Once
439445

440446
func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (stat.Connection, error) {
441447
tlsConfig := tls.ConfigFromStreamSettings(streamSettings)
@@ -444,13 +450,24 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
444450
}
445451

446452
requireDatagram := hyCtx.RequireDatagramFromContext(ctx)
447-
addr := dest.NetAddr()
448453
config := streamSettings.ProtocolSettings.(*Config)
449454

450-
manger.mutex.Lock()
451-
c, ok := manger.m[addr]
455+
initmanager.Do(func() {
456+
manager = &clientManager{
457+
m: make(map[dialerConf]*client),
458+
}
459+
(&task.Periodic{
460+
Interval: 30 * time.Second,
461+
Execute: func() error {
462+
manager.clean()
463+
return nil
464+
},
465+
}).Start()
466+
})
467+
manager.mutex.Lock()
468+
dest.Network = net.Network_UDP
469+
c, ok := manager.m[dialerConf{Destination: dest, MemoryStreamConfig: streamSettings}]
452470
if !ok {
453-
dest.Network = net.Network_UDP
454471
c = &client{
455472
ctx: ctx,
456473
dest: dest,
@@ -460,30 +477,17 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
460477
udpmaskManager: streamSettings.UdpmaskManager,
461478
quicParams: streamSettings.QuicParams,
462479
}
463-
manger.m[addr] = c
480+
manager.m[dialerConf{Destination: dest, MemoryStreamConfig: streamSettings}] = c
464481
}
465482
c.setCtx(ctx)
466-
manger.mutex.Unlock()
483+
manager.mutex.Unlock()
467484

468485
if requireDatagram {
469486
return c.udp()
470487
}
471488
return c.tcp()
472489
}
473490

474-
func init() {
475-
manger = &clientManager{
476-
m: make(map[string]*client),
477-
}
478-
(&task.Periodic{
479-
Interval: 30 * time.Second,
480-
Execute: func() error {
481-
manger.clean()
482-
return nil
483-
},
484-
}).Start()
485-
}
486-
487491
func init() {
488492
common.Must(internet.RegisterTransportDialer(protocolName, Dial))
489493
}

0 commit comments

Comments
 (0)