Skip to content

Commit 529ce0a

Browse files
authored
Thread safety: Remove race in RingbufferLogger (#6881)
1 parent f0816b0 commit 529ce0a

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

src/enclave/main.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ extern "C"
117117

118118
// Note: because logger uses ringbuffer, logger can only be initialised once
119119
// ringbuffer memory has been verified
120-
auto new_logger = std::make_unique<ccf::RingbufferLogger>(
121-
writer_factory->create_writer_to_outside());
120+
auto new_logger = std::make_unique<ccf::RingbufferLogger>(*writer_factory);
122121
auto ringbuffer_logger = new_logger.get();
123122
ccf::logger::config::loggers().push_back(std::move(new_logger));
124123

src/enclave/ringbuffer_logger.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,28 @@ namespace ccf
99
class RingbufferLogger : public ccf::logger::AbstractLogger
1010
{
1111
protected:
12-
ringbuffer::WriterPtr writer;
12+
ringbuffer::AbstractWriterFactory& writer_factory;
1313

1414
// Current time, as us duration since epoch (from system_clock). Used to
1515
// produce offsets to host time when logging from inside the enclave
1616
std::atomic<std::chrono::microseconds> us = {};
1717

1818
public:
19-
RingbufferLogger(const ringbuffer::WriterPtr& writer_) : writer(writer_) {}
19+
RingbufferLogger(ringbuffer::AbstractWriterFactory& wf_) :
20+
writer_factory(wf_)
21+
{}
2022

2123
void write(
2224
const ccf::logger::LogLine& line,
2325
const std::optional<double>& enclave_offset = std::nullopt) override
2426
{
27+
thread_local ringbuffer::WriterPtr writer = nullptr;
28+
29+
if (writer == nullptr)
30+
{
31+
writer = writer_factory.create_writer_to_outside();
32+
}
33+
2534
writer->write(
2635
AdminMessage::log_msg,
2736
us.load().count(),

0 commit comments

Comments
 (0)