diff --git a/pkg/nathole/controller.go b/pkg/nathole/controller.go index 88d788d6..2562bfd2 100644 --- a/pkg/nathole/controller.go +++ b/pkg/nathole/controller.go @@ -152,7 +152,9 @@ func (c *Controller) GenSid() string { func (c *Controller) HandleVisitor(m *msg.NatHoleVisitor, transporter transport.MessageTransporter, visitorUser string) { if m.PreCheck { + c.mu.RLock() cfg, ok := c.clientCfgs[m.ProxyName] + c.mu.RUnlock() if !ok { _ = transporter.Send(c.GenNatHoleResponse(m.TransactionID, nil, fmt.Sprintf("xtcp server for [%s] doesn't exist", m.ProxyName))) return diff --git a/pkg/util/net/udp.go b/pkg/util/net/udp.go index 79ebbb14..4c10fc02 100644 --- a/pkg/util/net/udp.go +++ b/pkg/util/net/udp.go @@ -168,11 +168,15 @@ func ListenUDP(bindAddr string, bindPort int) (l *UDPListener, err error) { return l, err } readConn, err := net.ListenUDP("udp", udpAddr) + if err != nil { + return l, err + } l = &UDPListener{ addr: udpAddr, acceptCh: make(chan net.Conn), writeCh: make(chan *UDPPacket, 1000), + readConn: readConn, fakeConns: make(map[string]*FakeUDPConn), } diff --git a/server/proxy/proxy.go b/server/proxy/proxy.go index dcc652a0..5b7898eb 100644 --- a/server/proxy/proxy.go +++ b/server/proxy/proxy.go @@ -150,7 +150,7 @@ func (pxy *BaseProxy) GetWorkConnFromPool(src, dst net.Addr) (workConn net.Conn, dstAddr, dstPortStr, _ = net.SplitHostPort(dst.String()) dstPort, _ = strconv.ParseUint(dstPortStr, 10, 16) } - err := msg.WriteMsg(workConn, &msg.StartWorkConn{ + err = msg.WriteMsg(workConn, &msg.StartWorkConn{ ProxyName: pxy.GetName(), SrcAddr: srcAddr, SrcPort: uint16(srcPort), @@ -161,6 +161,7 @@ func (pxy *BaseProxy) GetWorkConnFromPool(src, dst net.Addr) (workConn net.Conn, if err != nil { xl.Warnf("failed to send message to work connection from pool: %v, times: %d", err, i) workConn.Close() + workConn = nil } else { break }