mirror of
https://github.com/zeek/zeek.git
synced 2025-10-11 02:58:20 +00:00
fixed 3 leaks in creating pattern values
This commit is contained in:
parent
610d1ae407
commit
2fa1ea77e4
4 changed files with 49 additions and 5 deletions
17
src/NFA.cc
17
src/NFA.cc
|
@ -12,6 +12,7 @@ NFA_State::NFA_State(int arg_sym, EquivClass* ec)
|
|||
sym = arg_sym;
|
||||
ccl = 0;
|
||||
accept = NO_ACCEPT;
|
||||
first_trans_is_back_ref = false;
|
||||
mark = 0;
|
||||
epsclosure = 0;
|
||||
id = ++nfa_state_id;
|
||||
|
@ -33,6 +34,7 @@ NFA_State::NFA_State(CCL* arg_ccl)
|
|||
sym = SYM_CCL;
|
||||
ccl = arg_ccl;
|
||||
accept = NO_ACCEPT;
|
||||
first_trans_is_back_ref = false;
|
||||
mark = 0;
|
||||
id = ++nfa_state_id;
|
||||
epsclosure = 0;
|
||||
|
@ -41,7 +43,8 @@ NFA_State::NFA_State(CCL* arg_ccl)
|
|||
NFA_State::~NFA_State()
|
||||
{
|
||||
for ( int i = 0; i < xtions.length(); ++i )
|
||||
Unref(xtions[i]);
|
||||
if ( i > 0 || ! first_trans_is_back_ref )
|
||||
Unref(xtions[i]);
|
||||
|
||||
delete epsclosure;
|
||||
}
|
||||
|
@ -247,7 +250,10 @@ void NFA_Machine::MakePositiveClosure()
|
|||
{
|
||||
AppendEpsilon();
|
||||
final_state->AddXtion(first_state);
|
||||
Ref(first_state);
|
||||
|
||||
// Don't Ref the state the final epsilon points to, otherwise we'll
|
||||
// have reference cycles that lead to leaks.
|
||||
final_state->SetFirstTransIsBackRef();
|
||||
}
|
||||
|
||||
void NFA_Machine::MakeRepl(int lower, int upper)
|
||||
|
@ -307,6 +313,13 @@ NFA_Machine* make_alternate(NFA_Machine* m1, NFA_Machine* m2)
|
|||
m2->AppendState(last);
|
||||
Ref(last);
|
||||
|
||||
// Keep these around.
|
||||
Ref(m1->FirstState());
|
||||
Ref(m2->FirstState());
|
||||
|
||||
Unref(m1);
|
||||
Unref(m2);
|
||||
|
||||
return new NFA_Machine(first, last);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue