mirror of
https://github.com/zeek/zeek.git
synced 2025-10-04 23:58:20 +00:00
Fix memory leak in Zeek when-statement bodies with runtime errors
This commit is contained in:
parent
b045ce4bb3
commit
94656c2308
2 changed files with 19 additions and 6 deletions
|
@ -321,9 +321,14 @@ bool Trigger::Eval()
|
|||
delete [] pname;
|
||||
#endif
|
||||
|
||||
trigger->Cache(frame->GetCall(), v.get());
|
||||
auto queued = trigger->Cache(frame->GetCall(), v.get());
|
||||
trigger->Release();
|
||||
frame->ClearTrigger();
|
||||
|
||||
if ( ! queued && trigger->TimeoutValue() < 0 )
|
||||
// Usually the parent-trigger would get unref'd either by
|
||||
// its Eval() or its eventual Timeout(), but has neither
|
||||
Unref(trigger);
|
||||
}
|
||||
|
||||
Unref(f);
|
||||
|
@ -368,9 +373,14 @@ void Trigger::Timeout()
|
|||
DBG_LOG(DBG_NOTIFIERS, "%s: trigger has parent %s, caching timeout result", Name(), pname);
|
||||
delete [] pname;
|
||||
#endif
|
||||
trigger->Cache(frame->GetCall(), v.get());
|
||||
auto queued = trigger->Cache(frame->GetCall(), v.get());
|
||||
trigger->Release();
|
||||
frame->ClearTrigger();
|
||||
|
||||
if ( ! queued && trigger->TimeoutValue() < 0 )
|
||||
// Usually the parent-trigger would get unref'd either by
|
||||
// its Eval() or its eventual Timeout(), but has neither
|
||||
Unref(trigger);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -429,10 +439,10 @@ void Trigger::Attach(Trigger *trigger)
|
|||
Hold();
|
||||
}
|
||||
|
||||
void Trigger::Cache(const CallExpr* expr, Val* v)
|
||||
bool Trigger::Cache(const CallExpr* expr, Val* v)
|
||||
{
|
||||
if ( disabled || ! v )
|
||||
return;
|
||||
return false;
|
||||
|
||||
ValCache::iterator i = cache.find(expr);
|
||||
|
||||
|
@ -448,6 +458,7 @@ void Trigger::Cache(const CallExpr* expr, Val* v)
|
|||
Ref(v);
|
||||
|
||||
trigger_mgr->Queue(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -59,8 +59,10 @@ public:
|
|||
// to the given trigger. Note, automatically calls Hold().
|
||||
void Attach(Trigger* trigger);
|
||||
|
||||
// Cache for return values of delayed function calls.
|
||||
void Cache(const CallExpr* expr, Val* val);
|
||||
// Cache for return values of delayed function calls. Returns whether
|
||||
// the trigger is queued for later evaluation -- it may not be queued
|
||||
// if the Val is null or it's disabled.
|
||||
bool Cache(const CallExpr* expr, Val* val);
|
||||
Val* Lookup(const CallExpr*);
|
||||
|
||||
// Disable this trigger completely. Needed because Unref'ing the trigger
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue