From 9b5e6a7e9181e644c21eb8e3a5ab522985171d6e Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Sun, 21 Sep 2025 12:59:44 +0100 Subject: [PATCH] bisync: fix race when CaptureOutput is used concurrently #8815 Before this change CaptureOutput could trip the race detector when used concurrently. In particular if go routines using the logging are outlasting the return from `fun()`. This fixes the problem with a mutex. --- cmd/bisync/bilib/output.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/bisync/bilib/output.go b/cmd/bisync/bilib/output.go index 00ac8d78e..f83b6bd07 100644 --- a/cmd/bisync/bilib/output.go +++ b/cmd/bisync/bilib/output.go @@ -4,15 +4,19 @@ package bilib import ( "bytes" "log/slog" + "sync" "github.com/rclone/rclone/fs/log" ) // CaptureOutput runs a function capturing its output at log level INFO. func CaptureOutput(fun func()) []byte { + var mu sync.Mutex buf := &bytes.Buffer{} oldLevel := log.Handler.SetLevel(slog.LevelInfo) log.Handler.SetOutput(func(level slog.Level, text string) { + mu.Lock() + defer mu.Unlock() buf.WriteString(text) }) defer func() { @@ -20,5 +24,7 @@ func CaptureOutput(fun func()) []byte { log.Handler.SetLevel(oldLevel) }() fun() + mu.Lock() + defer mu.Unlock() return buf.Bytes() }