From 22055176d23417ac9039f14efdc668ed6cc6a7b9 Mon Sep 17 00:00:00 2001 From: Ephex2 Date: Wed, 26 Jan 2022 17:44:20 -0500 Subject: general: Fix issue causing log threads to hang indefinitely when print() panics The function printIfNotPrinted() defined for DistinctLogger unlocked the mutex within the logger only after the print() function ran. If print panics, the mutex would stay locked and future attempts to read or write from the logger mutex would cause the goroutine to hang indefinitely. Deferred the unlocking of the mutex to prevent this. Also, put l.m[key] before the print() call since this will prevent another bug where the same warning potentially gets logged multiple times if the print() call panics. Fixes #9380 --- helpers/general.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'helpers/general.go') diff --git a/helpers/general.go b/helpers/general.go index 236a763fa..472ebc4a4 100644 --- a/helpers/general.go +++ b/helpers/general.go @@ -360,9 +360,10 @@ func (l *DistinctLogger) printIfNotPrinted(level, logStatement string, print fun return } l.Lock() + defer l.Unlock() + l.m[key] = true // Placing this after print() can cause duplicate warning entries to be logged when --panicOnWarning is true. print() - l.m[key] = true - l.Unlock() + } // NewDistinctErrorLogger creates a new DistinctLogger that logs ERRORs -- cgit v1.2.3