From 4ec9a8622749789d96edb394a91187890fb592db Mon Sep 17 00:00:00 2001 From: Dmitrii Okunev Date: Wed, 9 Oct 2024 14:06:52 +0100 Subject: [PATCH] bugfix(client): panic: send on closed channel Fix: panic: send on closed channel goroutine 751872 [running]: github.com/andreykaipov/goobs.(*Client).writeEvent(...) /home/xaionaro/.gvm/pkgsets/go1.22.1/global/pkg/mod/github.com/andreykaipov/goobs@v1.4.1/client.go:363 github.com/andreykaipov/goobs.(*Client).handleOpcodes(0xc0020c81a0, 0xc0013846c0) /home/xaionaro/.gvm/pkgsets/go1.22.1/global/pkg/mod/github.com/andreykaipov/goobs@v1.4.1/client.go:338 +0x5a5 created by github.com/andreykaipov/goobs.(*Client).connect in goroutine 751658 /home/xaionaro/.gvm/pkgsets/go1.22.1/global/pkg/mod/github.com/andreykaipov/goobs@v1.4.1/client.go:200 Essentially by design we should close a channel only after we finished all possible writing to it. Thus moving the close statement of channel IncomingResponses to be called right after the writer to the channel is finished. --- client.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client.go b/client.go index 2eeabb1..efe20ab 100644 --- a/client.go +++ b/client.go @@ -141,7 +141,6 @@ func (c *Client) markDisconnected() { c.client.Log.Printf("[TRACE] Closing internal channels") close(c.IncomingEvents) close(c.client.Opcodes) - close(c.client.IncomingResponses) close(c.client.Disconnected) }) } @@ -210,7 +209,10 @@ func (c *Client) connect() (err error) { authComplete := make(chan error) go c.handleRawServerMessages(authComplete) - go c.handleOpcodes(authComplete) + go func() { + c.handleOpcodes(authComplete) + close(c.client.IncomingResponses) + }() timer := time.NewTimer(c.client.ResponseTimeout * time.Millisecond) defer timer.Stop()