Skip to content

Commit dd30a5c

Browse files
authored
fix: Avoid use-after-free in MessageLogger (#3873)
1 parent 8254680 commit dd30a5c

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

libmamba/src/core/output.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -362,13 +362,17 @@ namespace mamba
362362
void Console::print_buffer(std::ostream& ostream)
363363
{
364364
auto& data = instance().p_data;
365-
for (auto& message : data->m_buffer)
365+
decltype(data->m_buffer) tmp;
366+
366367
{
367-
ostream << message << '\n';
368+
const std::lock_guard<std::mutex> lock(data->m_mutex);
369+
data->m_buffer.swap(tmp);
368370
}
369371

370-
const std::lock_guard<std::mutex> lock(data->m_mutex);
371-
data->m_buffer.clear();
372+
for (const auto& message : tmp)
373+
{
374+
ostream << message << '\n';
375+
}
372376
}
373377

374378
// We use an overload instead of a default argument to avoid exposing std::cin
@@ -614,15 +618,19 @@ namespace mamba
614618

615619
void MessageLogger::print_buffer(std::ostream& /*ostream*/)
616620
{
617-
for (auto& [msg, level] : MessageLoggerData::m_buffer)
621+
decltype(MessageLoggerData::m_buffer) tmp;
622+
623+
{
624+
const std::lock_guard<std::mutex> lock(MessageLoggerData::m_mutex);
625+
MessageLoggerData::m_buffer.swap(tmp);
626+
}
627+
628+
for (const auto& [msg, level] : tmp)
618629
{
619630
emit(msg, level);
620631
}
621632

622633
spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) { l->flush(); });
623-
624-
const std::lock_guard<std::mutex> lock(MessageLoggerData::m_mutex);
625-
MessageLoggerData::m_buffer.clear();
626634
}
627635

628636

0 commit comments

Comments
 (0)