Skip to content

Commit 75b0c36

Browse files
committed
Fix: avoid panic by never closing channel twice
1 parent 1516eda commit 75b0c36

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

conn.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ type Conn struct {
2121

2222
input chan *Frame
2323
output chan *Frame
24-
closer chan struct{}
25-
errch chan error
24+
25+
closer chan struct{}
26+
closeOnce sync.Once
27+
28+
errch chan error
2629

2730
// buffered messages
2831
buffered *bytebufferpool.ByteBuffer
@@ -242,7 +245,7 @@ func (c *Conn) CloseDetail(status StatusCode, reason string) {
242245

243246
c.WriteFrame(fr)
244247

245-
close(c.closer)
248+
c.closeOnce.Do(func() { close(c.closer) })
246249
}
247250

248251
return

server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ func (s *Server) handlePong(c *Conn, data []byte) {
462462
}
463463

464464
func (s *Server) handleClose(c *Conn, fr *Frame) {
465-
defer close(c.closer)
465+
defer c.closeOnce.Do(func() { close(c.closer) })
466466
c.errch <- func() error {
467467
if fr.Status() != StatusNone {
468468
return Error{

0 commit comments

Comments
 (0)