From be83b1d8262940f91b07642af343b766171d6d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Svensson?= Date: Tue, 21 Dec 2021 21:24:19 +0100 Subject: [PATCH] Fix leak in Jaeger exporter The jaeger_span was never destroyed after its release from the JaegerRecordable. This change let a `std::unique_ptr` handle the destruction when going out of scope, first allowing the `thrift::Span` to be copied to the `span_buffer_`. --- exporters/jaeger/src/thrift_sender.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/exporters/jaeger/src/thrift_sender.cc b/exporters/jaeger/src/thrift_sender.cc index 52f32184f8..548f90770a 100644 --- a/exporters/jaeger/src/thrift_sender.cc +++ b/exporters/jaeger/src/thrift_sender.cc @@ -37,11 +37,11 @@ int ThriftSender::Append(std::unique_ptr &&span) noexcept max_span_bytes -= process_bytes_size_; } - thrift::Span &jaeger_span = *span->Span(); - jaeger_span.__set_tags(span->Tags()); - jaeger_span.__set_logs(span->Logs()); + auto jaeger_span = std::unique_ptr(span->Span()); + jaeger_span->__set_tags(span->Tags()); + jaeger_span->__set_logs(span->Logs()); - const uint32_t span_size = CalcSizeOfSerializedThrift(jaeger_span); + const uint32_t span_size = CalcSizeOfSerializedThrift(*jaeger_span); if (span_size > max_span_bytes) { OTEL_INTERNAL_LOG_ERROR("[JAEGER TRACE Exporter] Append() failed: too large span"); @@ -51,7 +51,7 @@ int ThriftSender::Append(std::unique_ptr &&span) noexcept byte_buffer_size_ += span_size; if (byte_buffer_size_ <= max_span_bytes) { - span_buffer_.push_back(jaeger_span); + span_buffer_.push_back(*jaeger_span); if (byte_buffer_size_ < max_span_bytes) { return 0; @@ -64,7 +64,7 @@ int ThriftSender::Append(std::unique_ptr &&span) noexcept } const auto flushed = Flush(); - span_buffer_.push_back(jaeger_span); + span_buffer_.push_back(*jaeger_span); byte_buffer_size_ = span_size + process_bytes_size_; return flushed;