From 93289aab032745125297c735ce4dac9a59b40367 Mon Sep 17 00:00:00 2001
From: "Jeb.Wang" <jeb.wannng@gmail.com>
Date: Wed, 15 Jan 2025 17:14:31 +0800
Subject: [PATCH 1/3] Fix goroutine leaks

---
 server/proxy/xtcp.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/server/proxy/xtcp.go b/server/proxy/xtcp.go
index f69d0790..bac7349e 100644
--- a/server/proxy/xtcp.go
+++ b/server/proxy/xtcp.go
@@ -43,6 +43,7 @@ func NewXTCPProxy(baseProxy *BaseProxy) Proxy {
 	return &XTCPProxy{
 		BaseProxy: baseProxy,
 		cfg:       unwrapped,
+		closeCh:   make(chan struct{}),
 	}
 }
 

From 881f21431d312885d54bd471e8849eabce6216b0 Mon Sep 17 00:00:00 2001
From: "Jeb.Wang" <jeb.wannng@gmail.com>
Date: Wed, 15 Jan 2025 19:02:46 +0800
Subject: [PATCH 2/3] Fix goroutine leaks

---
 server/proxy/xtcp.go | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/server/proxy/xtcp.go b/server/proxy/xtcp.go
index bac7349e..4c555de2 100644
--- a/server/proxy/xtcp.go
+++ b/server/proxy/xtcp.go
@@ -17,6 +17,7 @@ package proxy
 import (
 	"fmt"
 	"reflect"
+	"sync"
 
 	"github.com/fatedier/golib/errors"
 
@@ -32,7 +33,8 @@ type XTCPProxy struct {
 	*BaseProxy
 	cfg *v1.XTCPProxyConfig
 
-	closeCh chan struct{}
+	closeCh   chan struct{}
+	closeOnce sync.Once
 }
 
 func NewXTCPProxy(baseProxy *BaseProxy) Proxy {
@@ -90,7 +92,9 @@ func (pxy *XTCPProxy) Run() (remoteAddr string, err error) {
 func (pxy *XTCPProxy) Close() {
 	pxy.BaseProxy.Close()
 	pxy.rc.NatHoleController.CloseClient(pxy.GetName())
-	_ = errors.PanicToError(func() {
-		close(pxy.closeCh)
+	pxy.closeOnce.Do(func() {
+		_ = errors.PanicToError(func() {
+			close(pxy.closeCh)
+		})
 	})
 }

From 751c789cca6039f79a04a1b3a9e2e17fa795c7b3 Mon Sep 17 00:00:00 2001
From: "Jeb.Wang" <jeb.wannng@gmail.com>
Date: Wed, 15 Jan 2025 22:32:48 +0800
Subject: [PATCH 3/3] Fix goroutine leaks

---
 server/proxy/xtcp.go | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/server/proxy/xtcp.go b/server/proxy/xtcp.go
index 4c555de2..1ccf331c 100644
--- a/server/proxy/xtcp.go
+++ b/server/proxy/xtcp.go
@@ -19,8 +19,6 @@ import (
 	"reflect"
 	"sync"
 
-	"github.com/fatedier/golib/errors"
-
 	v1 "github.com/fatedier/frp/pkg/config/v1"
 	"github.com/fatedier/frp/pkg/msg"
 )
@@ -90,11 +88,9 @@ func (pxy *XTCPProxy) Run() (remoteAddr string, err error) {
 }
 
 func (pxy *XTCPProxy) Close() {
-	pxy.BaseProxy.Close()
-	pxy.rc.NatHoleController.CloseClient(pxy.GetName())
 	pxy.closeOnce.Do(func() {
-		_ = errors.PanicToError(func() {
-			close(pxy.closeCh)
-		})
+		pxy.BaseProxy.Close()
+		pxy.rc.NatHoleController.CloseClient(pxy.GetName())
+		close(pxy.closeCh)
 	})
 }