fix: Avoid use-after-free in MessageLogger (#3873)

This commit is contained in:
Jindřich Makovička 2025-05-12 10:01:18 +02:00 committed by GitHub
parent 8254680fd7
commit dd30a5c287
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 16 additions and 8 deletions

View File

@ -362,13 +362,17 @@ namespace mamba
void Console::print_buffer(std::ostream& ostream)
{
auto& data = instance().p_data;
for (auto& message : data->m_buffer)
decltype(data->m_buffer) tmp;
{
const std::lock_guard<std::mutex> lock(data->m_mutex);
data->m_buffer.swap(tmp);
}
for (const auto& message : tmp)
{
ostream << message << '\n';
}
const std::lock_guard<std::mutex> lock(data->m_mutex);
data->m_buffer.clear();
}
// We use an overload instead of a default argument to avoid exposing std::cin
@ -614,15 +618,19 @@ namespace mamba
void MessageLogger::print_buffer(std::ostream& /*ostream*/)
{
for (auto& [msg, level] : MessageLoggerData::m_buffer)
decltype(MessageLoggerData::m_buffer) tmp;
{
const std::lock_guard<std::mutex> lock(MessageLoggerData::m_mutex);
MessageLoggerData::m_buffer.swap(tmp);
}
for (const auto& [msg, level] : tmp)
{
emit(msg, level);
}
spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) { l->flush(); });
const std::lock_guard<std::mutex> lock(MessageLoggerData::m_mutex);
MessageLoggerData::m_buffer.clear();
}