mirror of https://github.com/mamba-org/mamba.git
fix: Avoid use-after-free in MessageLogger (#3873)
This commit is contained in:
parent
8254680fd7
commit
dd30a5c287
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue