Fix memory leak in Zeek when-statement bodies with runtime errors

This commit is contained in:
Jon Siwek 2020-03-23 21:50:00 -07:00
parent b045ce4bb3
commit 94656c2308
2 changed files with 19 additions and 6 deletions

View file

@ -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;
}