forked from Mxmilu666/frp
fix: three high-severity bugs across nathole, proxy, and udp modules (#5214)
- pkg/nathole: add RLock when reading clientCfgs map in PreCheck path to prevent concurrent map read/write crash - server/proxy: fix error variable shadowing in GetWorkConnFromPool that could return a closed connection with nil error - pkg/util/net: check ListenUDP error before spawning goroutines and assign readConn to struct field so Close() works correctly
This commit is contained in:
@@ -152,7 +152,9 @@ func (c *Controller) GenSid() string {
|
|||||||
|
|
||||||
func (c *Controller) HandleVisitor(m *msg.NatHoleVisitor, transporter transport.MessageTransporter, visitorUser string) {
|
func (c *Controller) HandleVisitor(m *msg.NatHoleVisitor, transporter transport.MessageTransporter, visitorUser string) {
|
||||||
if m.PreCheck {
|
if m.PreCheck {
|
||||||
|
c.mu.RLock()
|
||||||
cfg, ok := c.clientCfgs[m.ProxyName]
|
cfg, ok := c.clientCfgs[m.ProxyName]
|
||||||
|
c.mu.RUnlock()
|
||||||
if !ok {
|
if !ok {
|
||||||
_ = transporter.Send(c.GenNatHoleResponse(m.TransactionID, nil, fmt.Sprintf("xtcp server for [%s] doesn't exist", m.ProxyName)))
|
_ = transporter.Send(c.GenNatHoleResponse(m.TransactionID, nil, fmt.Sprintf("xtcp server for [%s] doesn't exist", m.ProxyName)))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -168,11 +168,15 @@ func ListenUDP(bindAddr string, bindPort int) (l *UDPListener, err error) {
|
|||||||
return l, err
|
return l, err
|
||||||
}
|
}
|
||||||
readConn, err := net.ListenUDP("udp", udpAddr)
|
readConn, err := net.ListenUDP("udp", udpAddr)
|
||||||
|
if err != nil {
|
||||||
|
return l, err
|
||||||
|
}
|
||||||
|
|
||||||
l = &UDPListener{
|
l = &UDPListener{
|
||||||
addr: udpAddr,
|
addr: udpAddr,
|
||||||
acceptCh: make(chan net.Conn),
|
acceptCh: make(chan net.Conn),
|
||||||
writeCh: make(chan *UDPPacket, 1000),
|
writeCh: make(chan *UDPPacket, 1000),
|
||||||
|
readConn: readConn,
|
||||||
fakeConns: make(map[string]*FakeUDPConn),
|
fakeConns: make(map[string]*FakeUDPConn),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ func (pxy *BaseProxy) GetWorkConnFromPool(src, dst net.Addr) (workConn net.Conn,
|
|||||||
dstAddr, dstPortStr, _ = net.SplitHostPort(dst.String())
|
dstAddr, dstPortStr, _ = net.SplitHostPort(dst.String())
|
||||||
dstPort, _ = strconv.ParseUint(dstPortStr, 10, 16)
|
dstPort, _ = strconv.ParseUint(dstPortStr, 10, 16)
|
||||||
}
|
}
|
||||||
err := msg.WriteMsg(workConn, &msg.StartWorkConn{
|
err = msg.WriteMsg(workConn, &msg.StartWorkConn{
|
||||||
ProxyName: pxy.GetName(),
|
ProxyName: pxy.GetName(),
|
||||||
SrcAddr: srcAddr,
|
SrcAddr: srcAddr,
|
||||||
SrcPort: uint16(srcPort),
|
SrcPort: uint16(srcPort),
|
||||||
@@ -161,6 +161,7 @@ func (pxy *BaseProxy) GetWorkConnFromPool(src, dst net.Addr) (workConn net.Conn,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
xl.Warnf("failed to send message to work connection from pool: %v, times: %d", err, i)
|
xl.Warnf("failed to send message to work connection from pool: %v, times: %d", err, i)
|
||||||
workConn.Close()
|
workConn.Close()
|
||||||
|
workConn = nil
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user