From 007ff0bae950106a822b1825dbac68e824f3e1b3 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sun, 7 Sep 2025 14:20:05 +0800 Subject: [PATCH] fix panic for channel close --- listener/dns/server.go | 5 +++++ listener/grpc/server.go | 5 +++++ listener/http2/conn.go | 5 +++++ listener/http2/h2/conn.go | 7 +++++++ listener/http3/conn.go | 5 +++++ 5 files changed, 27 insertions(+) diff --git a/listener/dns/server.go b/listener/dns/server.go index 2c0c7168..9d544f9e 100644 --- a/listener/dns/server.go +++ b/listener/dns/server.go @@ -7,6 +7,7 @@ import ( "io" "net" "net/http" + "sync" "time" xnet "github.com/go-gost/x/internal/net" @@ -77,6 +78,7 @@ type serverConn struct { w ResponseWriter laddr net.Addr closed chan struct{} + mu sync.Mutex } func (c *serverConn) Read(b []byte) (n int, err error) { @@ -100,6 +102,9 @@ func (c *serverConn) Write(b []byte) (n int, err error) { } func (c *serverConn) Close() error { + c.mu.Lock() + defer c.mu.Unlock() + select { case <-c.closed: default: diff --git a/listener/grpc/server.go b/listener/grpc/server.go index 24568722..384604bf 100644 --- a/listener/grpc/server.go +++ b/listener/grpc/server.go @@ -6,6 +6,7 @@ import ( "io" "net" "strings" + "sync" "time" "github.com/go-gost/core/logger" @@ -88,6 +89,7 @@ type conn struct { remoteAddr net.Addr closed chan struct{} ctx context.Context + mu sync.Mutex } func (c *conn) Read(b []byte) (n int, err error) { @@ -135,6 +137,9 @@ func (c *conn) Write(b []byte) (n int, err error) { } func (c *conn) Close() error { + c.mu.Lock() + defer c.mu.Unlock() + select { case <-c.closed: default: diff --git a/listener/http2/conn.go b/listener/http2/conn.go index 956302e6..ff21ee28 100644 --- a/listener/http2/conn.go +++ b/listener/http2/conn.go @@ -4,6 +4,7 @@ import ( "context" "errors" "net" + "sync" "time" ) @@ -14,6 +15,7 @@ type conn struct { ctx context.Context cancel context.CancelFunc closed chan struct{} + mu sync.Mutex } func (c *conn) Read(b []byte) (n int, err error) { @@ -29,6 +31,9 @@ func (c *conn) Close() error { c.cancel() } + c.mu.Lock() + defer c.mu.Unlock() + select { case <-c.closed: default: diff --git a/listener/http2/h2/conn.go b/listener/http2/h2/conn.go index 956cc1d1..78a59093 100644 --- a/listener/http2/h2/conn.go +++ b/listener/http2/h2/conn.go @@ -6,6 +6,7 @@ import ( "io" "net" "net/http" + "sync" "time" ) @@ -17,6 +18,7 @@ type conn struct { localAddr net.Addr closed chan struct{} ctx context.Context + mu sync.Mutex } func (c *conn) Read(b []byte) (n int, err error) { @@ -28,12 +30,17 @@ func (c *conn) Write(b []byte) (n int, err error) { } func (c *conn) Close() (err error) { + c.mu.Lock() + select { case <-c.closed: + c.mu.Unlock() return default: close(c.closed) } + c.mu.Unlock() + if rc, ok := c.r.(io.Closer); ok { err = rc.Close() } diff --git a/listener/http3/conn.go b/listener/http3/conn.go index 0adcc02d..87a0bd29 100644 --- a/listener/http3/conn.go +++ b/listener/http3/conn.go @@ -4,6 +4,7 @@ import ( "context" "errors" "net" + "sync" "time" ) @@ -13,6 +14,7 @@ type conn struct { raddr net.Addr closed chan struct{} ctx context.Context + mu sync.Mutex } func (c *conn) Read(b []byte) (n int, err error) { @@ -24,6 +26,9 @@ func (c *conn) Write(b []byte) (n int, err error) { } func (c *conn) Close() error { + c.mu.Lock() + defer c.mu.Unlock() + select { case <-c.closed: default: