From ee9ec21eb06ec0156f53f580a38fb6fa060d36ad Mon Sep 17 00:00:00 2001 From: ShangSky Date: Mon, 8 Apr 2024 17:25:22 +0800 Subject: [PATCH 1/2] fix proxy server memory leak --- pkg/proxy/net.go | 10 +++++++--- pkg/proxy/proxy.go | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pkg/proxy/net.go b/pkg/proxy/net.go index 24ea8cb..85e3622 100644 --- a/pkg/proxy/net.go +++ b/pkg/proxy/net.go @@ -41,7 +41,11 @@ type ConnNotify struct { closed chan struct{} } -func (c *ConnNotify) Close() { - c.Conn.Close() - c.closed <- struct{}{} +func (c *ConnNotify) Close() error { + err := c.Conn.Close() + select { + case c.closed <- struct{}{}: + default: + } + return err } diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go index 75cb65d..1591d6b 100644 --- a/pkg/proxy/proxy.go +++ b/pkg/proxy/proxy.go @@ -208,8 +208,8 @@ func (p *Proxy) handleConnect(w http.ResponseWriter) { return } - clientConnNotify := ConnNotify{tlsConn, make(chan struct{})} - l := &OnceAcceptListener{clientConnNotify.Conn} + clientConnNotify := &ConnNotify{tlsConn, make(chan struct{})} + l := &OnceAcceptListener{clientConnNotify} err = http.Serve(l, p) if err != nil && !errors.Is(err, ErrAlreadyAccepted) { From a56abe4e7170ef3e446a1ad530b446050f9d624e Mon Sep 17 00:00:00 2001 From: ShangSky Date: Tue, 9 Apr 2024 14:28:51 +0800 Subject: [PATCH 2/2] chan add length --- pkg/proxy/proxy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/proxy/proxy.go b/pkg/proxy/proxy.go index 1591d6b..79c114d 100644 --- a/pkg/proxy/proxy.go +++ b/pkg/proxy/proxy.go @@ -208,7 +208,7 @@ func (p *Proxy) handleConnect(w http.ResponseWriter) { return } - clientConnNotify := &ConnNotify{tlsConn, make(chan struct{})} + clientConnNotify := &ConnNotify{tlsConn, make(chan struct{}, 1)} l := &OnceAcceptListener{clientConnNotify} err = http.Serve(l, p)