From 36255f1b38e77d02e96c6893e7cd7dd3e68e6921 Mon Sep 17 00:00:00 2001 From: Maxime Piraux Date: Tue, 15 Mar 2022 17:05:42 +0100 Subject: [PATCH] Fixes unregistering a channel on a possibly closed stream data broadcaster --- agents/http3_agent.go | 6 +++++- utils.go | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/agents/http3_agent.go b/agents/http3_agent.go index ecdd0b4..59b77ab 100644 --- a/agents/http3_agent.go +++ b/agents/http3_agent.go @@ -251,7 +251,11 @@ func (a *HTTP3Agent) SendRequest(path, method, authority string, headers map[str a.responseBuffer[streamID] = response go func() { // Pipes the data from the response stream to the agent - defer stream.ReadChan.Unregister(streamChan) + defer func() { + if !stream.ReadChan.IsClosed() { + stream.ReadChan.Unregister(streamChan) + } + }() for { select { case i := <-streamChan: diff --git a/utils.go b/utils.go index e3b8e1b..580597f 100644 --- a/utils.go +++ b/utils.go @@ -5,6 +5,7 @@ import "github.com/dustin/go-broadcast" type Broadcaster struct { broadcast.Broadcaster channels []chan interface{} + isClosed bool } func NewBroadcaster(buflen int) Broadcaster { @@ -19,8 +20,15 @@ func (b *Broadcaster) RegisterNewChan(size int) chan interface{} { } func (b *Broadcaster) Close() error { + if b.isClosed { + return nil + } + b.isClosed = true for _, c := range b.channels { close(c) } return b.Broadcaster.Close() +} +func (b *Broadcaster) IsClosed() bool { + return b.isClosed } \ No newline at end of file