diff --git a/CHANGES b/CHANGES index 664b0df750..2cc1309c76 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,10 @@ +3.1.0-dev.127 | 2019-09-20 10:40:54 -0700 + + * Fix uncaught InterpreterException in Frame cloning (Robin Sommer, Corelight) + + Fix for CIDs 1402823 and 1394050. + 3.1.0-dev.125 | 2019-09-19 16:40:10 -0700 * Update header include guard in zeek-config.h/bro-config.h (Jon Siwek, Corelight) diff --git a/VERSION b/VERSION index 6da107bae0..32619fcd0b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.1.0-dev.125 +3.1.0-dev.127 diff --git a/src/Frame.h b/src/Frame.h index 433c2ff375..efb1e2c398 100644 --- a/src/Frame.h +++ b/src/Frame.h @@ -128,7 +128,7 @@ public: /** * Performs a deep copy of all the values in the current frame. If * the frame has a closure the returned frame captures that closure - * by reference.. As such, performing a clone operation does not copy + * by reference. As such, performing a clone operation does not copy * the values in the closure. * * @return a copy of this frame. diff --git a/src/Trigger.cc b/src/Trigger.cc index ae6483e3f5..5caffaa74d 100644 --- a/src/Trigger.cc +++ b/src/Trigger.cc @@ -218,7 +218,22 @@ bool Trigger::Eval() // An alternative approach to copying the frame would be to deep-copy // the expression itself, replacing all references to locals with // constants. - Frame* f = frame->Clone(); + + Frame* f = nullptr; + + try + { + f = frame->Clone(); + } + catch ( InterpreterException& ) + { + // Frame contains values that couldn't be cloned. It's + // already been reported, disable trigger. + Disable(); + Unref(this); + return false; + } + f->SetTrigger(this); Val* v = nullptr;