From e912f2d7c002af2fe16273e5efd4439a7c69e70c Mon Sep 17 00:00:00 2001 From: Viktor Liu Date: Thu, 2 Jan 2025 18:59:53 +0100 Subject: [PATCH] Fix double close in logger --- client/firewall/uspfilter/log/log.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/client/firewall/uspfilter/log/log.go b/client/firewall/uspfilter/log/log.go index 85f064c16..02f108561 100644 --- a/client/firewall/uspfilter/log/log.go +++ b/client/firewall/uspfilter/log/log.go @@ -44,11 +44,12 @@ var levelStrings = map[Level]string{ // Logger is a high-performance, non-blocking logger type Logger struct { - output io.Writer - level atomic.Uint32 - buffer *ringBuffer - shutdown chan struct{} - wg sync.WaitGroup + output io.Writer + level atomic.Uint32 + buffer *ringBuffer + shutdown chan struct{} + closeOnce sync.Once + wg sync.WaitGroup // Reusable buffer pool for formatting messages bufPool sync.Pool @@ -170,9 +171,12 @@ func (l *Logger) worker() { // Stop gracefully shuts down the logger func (l *Logger) Stop(ctx context.Context) error { - close(l.shutdown) - done := make(chan struct{}) + + l.closeOnce.Do(func() { + close(l.shutdown) + }) + go func() { l.wg.Wait() close(done)