fix: frps handle multi conn may happen data race
@@ -297,32 +297,14 @@ func (svr *Service) Run() {
svr.HandleListener(svr.listener)
}
-func (svr *Service) HandleListener(l net.Listener) {
- // Listen for incoming connections from client.
- for {
- c, err := l.Accept()
- if err != nil {
- log.Warn("Listener for incoming connections from client closed")
- return
- }
- // inject xlog object into net.Conn context
- xl := xlog.New()
- c = frpNet.NewContextConn(c, xlog.NewContext(context.Background(), xl))
+func (svr *Service) handleConnection(ctx context.Context, conn net.Conn) {
+ xl := xlog.FromContextSafe(ctx)
- log.Trace("start check TLS connection...")
- originConn := c
- c, err = frpNet.CheckAndEnableTLSServerConnWithTimeout(c, svr.tlsConfig, svr.cfg.TlsOnly, connReadTimeout)
- if err != nil {
- log.Warn("CheckAndEnableTLSServerConnWithTimeout error: %v", err)
- originConn.Close()
- continue
- }
- log.Trace("success check TLS connection")
+ var (
+ rawMsg msg.Message
+ err error
+ )
- // Start a new goroutine for dealing connections.
- go func(frpConn net.Conn) {
- dealFn := func(conn net.Conn) {
- var rawMsg msg.Message
conn.SetReadDeadline(time.Now().Add(connReadTimeout))
if rawMsg, err = msg.ReadMsg(conn); err != nil {
log.Trace("Failed to read message: %v", err)
@@ -377,6 +359,32 @@ func (svr *Service) HandleListener(l net.Listener) {
}
}
+func (svr *Service) HandleListener(l net.Listener) {
+ // Listen for incoming connections from client.
+ for {
+ c, err := l.Accept()
+ if err != nil {
+ log.Warn("Listener for incoming connections from client closed")
+ return
+ }
+ // inject xlog object into net.Conn context
+ xl := xlog.New()
+ ctx := context.Background()
+
+ c = frpNet.NewContextConn(c, xlog.NewContext(ctx, xl))
+
+ log.Trace("start check TLS connection...")
+ originConn := c
+ c, err = frpNet.CheckAndEnableTLSServerConnWithTimeout(c, svr.tlsConfig, svr.cfg.TlsOnly, connReadTimeout)
+ if err != nil {
+ log.Warn("CheckAndEnableTLSServerConnWithTimeout error: %v", err)
+ originConn.Close()
+ continue
+ }
+ log.Trace("success check TLS connection")
+
+ // Start a new goroutine for dealing connections.
+ go func(ctx context.Context, frpConn net.Conn) {
if svr.cfg.TcpMux {
fmuxCfg := fmux.DefaultConfig()
fmuxCfg.KeepAliveInterval = 20 * time.Second
@@ -395,12 +403,12 @@ func (svr *Service) HandleListener(l net.Listener) {
session.Close()
return
}
- go dealFn(stream)
+ go svr.handleConnection(ctx, stream)
}
} else {
- dealFn(frpConn)
+ svr.handleConnection(ctx, frpConn)
}
- }(c)
+ }(ctx, c)
}
}
