mirror of https://github.com/XTLS/Xray-core
app/reverse/portal.go: Fix goroutine leak & Add EndpointOverride (#5100)
https://github.com/XTLS/Xray-core/issues/5088#issuecomment-3263558403pull/5107/head
parent
4b0ee28f1c
commit
4740ba2425
|
@ -84,11 +84,20 @@ func (p *Portal) HandleConnection(ctx context.Context, link *transport.Link) err
|
||||||
p.picker.AddWorker(worker)
|
p.picker.AddWorker(worker)
|
||||||
|
|
||||||
if _, ok := link.Reader.(*pipe.Reader); !ok {
|
if _, ok := link.Reader.(*pipe.Reader); !ok {
|
||||||
<-ctx.Done() // from DispatchLink()
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
case <-muxClient.WaitClosed():
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ob.Target.Network == net.Network_UDP && ob.OriginalTarget.Address != nil && ob.OriginalTarget.Address != ob.Target.Address {
|
||||||
|
link.Reader = &buf.EndpointOverrideReader{Reader: link.Reader, Dest: ob.Target.Address, OriginalDest: ob.OriginalTarget.Address}
|
||||||
|
link.Writer = &buf.EndpointOverrideWriter{Writer: link.Writer, Dest: ob.Target.Address, OriginalDest: ob.OriginalTarget.Address}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return p.client.Dispatch(ctx, link)
|
return p.client.Dispatch(ctx, link)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +114,7 @@ func (o *Outbound) Dispatch(ctx context.Context, link *transport.Link) {
|
||||||
if err := o.portal.HandleConnection(ctx, link); err != nil {
|
if err := o.portal.HandleConnection(ctx, link); err != nil {
|
||||||
errors.LogInfoInner(ctx, err, "failed to process reverse connection")
|
errors.LogInfoInner(ctx, err, "failed to process reverse connection")
|
||||||
common.Interrupt(link.Writer)
|
common.Interrupt(link.Writer)
|
||||||
|
common.Interrupt(link.Reader)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -215,6 +215,10 @@ func (m *ClientWorker) Closed() bool {
|
||||||
return m.done.Done()
|
return m.done.Done()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ClientWorker) WaitClosed() <-chan struct{} {
|
||||||
|
return m.done.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
func (m *ClientWorker) GetTimer() *time.Ticker {
|
func (m *ClientWorker) GetTimer() *time.Ticker {
|
||||||
return m.timer
|
return m.timer
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue