From b11397e4df9ba39dfadf83a68026f7425add36cd Mon Sep 17 00:00:00 2001 From: Nicholas Dudfield Date: Tue, 29 Jul 2025 08:25:07 +0700 Subject: [PATCH] fix(tests): prevent buffer corruption from concurrent log writes std::endl triggers flush() which calls sync() on the shared log buffer. Multiple threads racing in sync() cause str()/str("") operations to corrupt buffer state, leading to crashes and double frees. Added mutex to serialize access to suite.log, preventing concurrent sync() calls on the same buffer. --- src/test/unit_test/SuiteJournal.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/unit_test/SuiteJournal.h b/src/test/unit_test/SuiteJournal.h index 0e80e83cd..40d6bb94b 100644 --- a/src/test/unit_test/SuiteJournal.h +++ b/src/test/unit_test/SuiteJournal.h @@ -19,9 +19,9 @@ #ifndef TEST_UNIT_TEST_SUITE_JOURNAL_H #define TEST_UNIT_TEST_SUITE_JOURNAL_H - #include #include +#include namespace ripple { namespace test { @@ -82,7 +82,13 @@ SuiteJournalSink::write( // Only write the string if the level at least equals the threshold. if (level >= threshold()) + { + // std::endl flushes → sync() → str()/str("") race in shared buffer → + // crashes + static std::mutex log_mutex; + std::lock_guard lock(log_mutex); suite_.log << s << partition_ << text << std::endl; + } } class SuiteJournal