From 0669cfbebf8b8fbc73567e0251052d1d986c9390 Mon Sep 17 00:00:00 2001 From: infastin Date: Mon, 31 Mar 2025 19:12:07 +0500 Subject: [PATCH] fix(core): potential sender loop deadlock --- pkg/core/track.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/core/track.go b/pkg/core/track.go index d3f1467d..75efd61c 100644 --- a/pkg/core/track.go +++ b/pkg/core/track.go @@ -139,22 +139,29 @@ func (s *Sender) Start() { } s.done = make(chan struct{}) - go func() { - // for range on nil chan is OK - for packet := range s.buf { + // pass buf directly so that it's impossible for buf to be nil + go func(buf chan *Packet) { + for packet := range buf { s.Output(packet) } close(s.done) - }() + }(s.buf) } func (s *Sender) Wait() { - if done := s.done; done != nil { + s.mu.Lock() + done := s.done + s.mu.Unlock() + + if done != nil { <-done } } func (s *Sender) State() string { + s.mu.Lock() + defer s.mu.Unlock() + if s.buf == nil { return "closed" }