From 7a4ce9fb511bc99b97678280cf1f1373a758b43e Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Mon, 23 Mar 2020 11:41:37 -0700 Subject: [PATCH] Fix memory leak when runtime error occurs in a Zeek for-loop --- src/Stmt.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Stmt.cc b/src/Stmt.cc index 4c6fc82520..7f884fe3e4 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -1198,7 +1198,7 @@ IntrusivePtr ForStmt::DoExec(Frame* f, Val* v, stmt_flow_type& flow) const IterCookie* c = loop_vals->InitForIteration(); while ( (current_tev = loop_vals->NextEntry(k, c)) ) { - ListVal* ind_lv = tv->RecoverIndex(k); + IntrusivePtr ind_lv{AdoptRef{}, tv->RecoverIndex(k)}; delete k; if ( value_var ) @@ -1206,10 +1206,18 @@ IntrusivePtr ForStmt::DoExec(Frame* f, Val* v, stmt_flow_type& flow) const for ( int i = 0; i < ind_lv->Length(); i++ ) f->SetElement((*loop_vars)[i], ind_lv->Index(i)->Ref()); - Unref(ind_lv); flow = FLOW_NEXT; - ret = body->Exec(f, flow); + + try + { + ret = body->Exec(f, flow); + } + catch ( InterpreterException& ) + { + loop_vals->StopIteration(c); + throw; + } if ( flow == FLOW_BREAK || flow == FLOW_RETURN ) {