diff --git a/CHANGES b/CHANGES index 2db50d18b1..35ca065030 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +7.0.0-dev.147 | 2024-04-22 17:08:25 -0700 + + * Don't attempt to stop or flush disabled writer frontends (Tim Wojtulewicz, Corelight) + 7.0.0-dev.145 | 2024-04-22 15:55:53 -0700 * Allow SMB_TCP record to contain multiple protocol identifiers/headers (Tim Wojtulewicz, Corelight) diff --git a/VERSION b/VERSION index a92030a9cb..5b49ed2beb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.0.0-dev.145 +7.0.0-dev.147 diff --git a/src/logging/WriterFrontend.cc b/src/logging/WriterFrontend.cc index ecab930f7e..d1fae0d3f9 100644 --- a/src/logging/WriterFrontend.cc +++ b/src/logging/WriterFrontend.cc @@ -133,6 +133,11 @@ WriterFrontend::~WriterFrontend() { } void WriterFrontend::Stop() { + if ( disabled ) { + CleanupWriteBuffer(); + return; + } + FlushWriteBuffer(); SetDisable(); @@ -204,6 +209,11 @@ void WriterFrontend::Write(int arg_num_fields, Value** vals) { } void WriterFrontend::FlushWriteBuffer() { + if ( disabled ) { + CleanupWriteBuffer(); + return; + } + if ( ! write_buffer_pos ) // Nothing to do. return; @@ -261,4 +271,16 @@ void WriterFrontend::DeleteVals(int num_fields, Value** vals) { delete[] vals; } +void WriterFrontend::CleanupWriteBuffer() { + if ( ! write_buffer || write_buffer_pos == 0 ) + return; + + for ( int j = 0; j < write_buffer_pos; j++ ) + DeleteVals(num_fields, write_buffer[j]); + + delete[] write_buffer; + write_buffer = nullptr; + write_buffer_pos = 0; +} + } // namespace zeek::logging diff --git a/src/logging/WriterFrontend.h b/src/logging/WriterFrontend.h index fdfdffa127..dfd984b502 100644 --- a/src/logging/WriterFrontend.h +++ b/src/logging/WriterFrontend.h @@ -206,6 +206,9 @@ protected: static const int WRITER_BUFFER_SIZE = 1000; int write_buffer_pos; // Position of next write in buffer. threading::Value*** write_buffer; // Buffer of size WRITER_BUFFER_SIZE. + +private: + void CleanupWriteBuffer(); }; } // namespace zeek::logging