Merge remote-tracking branch 'origin/topic/vern/ZAM-tbl-iteration-memory-mgt-fix'

* origin/topic/vern/ZAM-tbl-iteration-memory-mgt-fix:
  fix for memory management associated with ZAM table iteration
This commit is contained in:
Tim Wojtulewicz 2024-12-13 08:04:17 -07:00
commit 805e9db588
3 changed files with 17 additions and 4 deletions

View file

@ -1,3 +1,7 @@
7.1.0-dev.818 | 2024-12-13 08:04:17 -0700
* fix for memory management associated with ZAM table iteration (Vern Paxson, Corelight)
7.1.0-dev.816 | 2024-12-13 12:59:08 +0100 7.1.0-dev.816 | 2024-12-13 12:59:08 +0100
* zeekygen: Disable Cluster::Experimental module (Arne Welzel, Corelight) * zeekygen: Disable Cluster::Experimental module (Arne Welzel, Corelight)

View file

@ -1 +1 @@
7.1.0-dev.816 7.1.0-dev.818

View file

@ -322,8 +322,9 @@ std::shared_ptr<ProfVec> ZBody::BuildProfVec() const {
class ZBodyStateManager { class ZBodyStateManager {
public: public:
// If fixed_frame is nil then creates a dynamic frame. // If fixed_frame is nil then creates a dynamic frame.
ZBodyStateManager(ZVal* _fixed_frame, int frame_size, const std::vector<int>& _managed_slots) ZBodyStateManager(ZVal* _fixed_frame, int frame_size, const std::vector<int>& _managed_slots,
: fixed_frame(_fixed_frame), managed_slots(_managed_slots) { TableIterVec* _tiv_ptr)
: fixed_frame(_fixed_frame), managed_slots(_managed_slots), tiv_ptr(_tiv_ptr) {
if ( fixed_frame ) if ( fixed_frame )
frame = fixed_frame; frame = fixed_frame;
else { else {
@ -333,7 +334,13 @@ public:
} }
} }
void SetTableIters(TableIterVec* _tiv_ptr) { tiv_ptr = _tiv_ptr; }
~ZBodyStateManager() { ~ZBodyStateManager() {
if ( tiv_ptr )
for ( auto& ti : *tiv_ptr )
ti.Clear();
if ( fixed_frame ) { if ( fixed_frame ) {
// Recover memory and reset for use in next call. // Recover memory and reset for use in next call.
for ( auto s : managed_slots ) { for ( auto s : managed_slots ) {
@ -356,6 +363,7 @@ private:
ZVal* fixed_frame; ZVal* fixed_frame;
ZVal* frame; ZVal* frame;
const std::vector<int>& managed_slots; const std::vector<int>& managed_slots;
TableIterVec* tiv_ptr;
}; };
ValPtr ZBody::Exec(Frame* f, StmtFlowType& flow) { ValPtr ZBody::Exec(Frame* f, StmtFlowType& flow) {
@ -393,7 +401,7 @@ ValPtr ZBody::Exec(Frame* f, StmtFlowType& flow) {
} }
#endif #endif
ZBodyStateManager state_mgr(fixed_frame, frame_size, managed_slots); ZBodyStateManager state_mgr(fixed_frame, frame_size, managed_slots, &table_iters);
std::unique_ptr<TableIterVec> local_table_iters; std::unique_ptr<TableIterVec> local_table_iters;
std::vector<StepIterInfo> step_iters(num_step_iters); std::vector<StepIterInfo> step_iters(num_step_iters);
@ -408,6 +416,7 @@ ValPtr ZBody::Exec(Frame* f, StmtFlowType& flow) {
local_table_iters = std::make_unique<TableIterVec>(table_iters.size()); local_table_iters = std::make_unique<TableIterVec>(table_iters.size());
*local_table_iters = table_iters; *local_table_iters = table_iters;
tiv_ptr = &(*local_table_iters); tiv_ptr = &(*local_table_iters);
state_mgr.SetTableIters(nullptr); // unique_ptr will clean it up directly
} }
} }