Skip to content
/ bro Public
forked from zeek/zeek

Commit

Permalink
Fix assignments to event arguments becoming visible to subsequent
Browse files Browse the repository at this point in the history
handlers.

It's well known that changes to mutable event arguments, like tables,
become visible to all places where those values are used, including
subsequent handlers of the same event. However, there's a related case
that's more suprising: simply assigning *a new value* to an event
argument passes through, too. This commit fixes that behaviour. (We
even had a btest with a baseline reflecting the problen).
  • Loading branch information
rsmmr committed Oct 27, 2017
1 parent 9b59157 commit 5b88936
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 6 deletions.
2 changes: 1 addition & 1 deletion aux/btest
Submodule btest updated from 154dd9 to 56a368
22 changes: 18 additions & 4 deletions src/Func.cc
Original file line number Diff line number Diff line change
Expand Up @@ -383,11 +383,7 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
FType()->FlavorString().c_str(), d.Description());
}

loop_over_list(*args, i)
f->SetElement(i, (*args)[i]);

stmt_flow_type flow = FLOW_NEXT;

Val* result = 0;

for ( size_t i = 0; i < bodies.size(); ++i )
Expand All @@ -397,6 +393,19 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
bodies[i].stmts->GetLocationInfo());

Unref(result);

loop_over_list(*args, j)
{
Val* arg = (*args)[j];
if ( f->NthElement(j) != arg )
{
// Either not yet set, or somebody reassigned
// the frame slot.
Ref(arg);
f->SetElement(j, arg);
}
}

f->Reset(args->length());

try
Expand Down Expand Up @@ -434,6 +443,11 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
}
}

// We have an extra Ref for each argument (so that they don't get
// deleted between bodies), release that.
loop_over_list(*args, k)
Unref((*args)[k]);

if ( Flavor() == FUNC_FLAVOR_HOOK )
{
if ( ! result )
Expand Down
2 changes: 2 additions & 0 deletions testing/btest/Baseline/core.event-arg-reuse/output
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
f1, 2
f2, 1
2 changes: 1 addition & 1 deletion testing/btest/Baseline/signatures.load-sigs/output
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[orig_h=141.142.220.118, orig_p=35642/tcp, resp_h=208.80.152.2, resp_p=80/tcp]
works
GET /images/wikimedia-button.png HTTP/1.1\x0d\x0aHost: meta.wikimedia.org\x0d\x0aUser-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Geck...
GET /images/wikimedia-button.png HTTP/1.1\x0d\x0aHost: meta.wikimedia.org\x0d\x0aUser-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15\x0d\x0aAccept: image/png,image/*;q=0.8,*/*;q=0.5\x0d\x0aAccept-Language: en-us,en;q=0.5\x0d\x0aAccept-Encoding: gzip,deflate\x0d\x0aAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\x0d\x0aKeep-Alive: 115\x0d\x0aConnection: keep-alive\x0d\x0aReferer: http://www.wikipedia.org/\x0d\x0aIf-Modified-Since: Fri, 05 Nov 2010 16:00:03 GMT\x0d\x0aIf-None-Match: "97a-494505e0c46c0"\x0d\x0aCache-Control: max-age=0\x0d\x0a\x0d\x0a
20 changes: 20 additions & 0 deletions testing/btest/core/event-arg-reuse.bro
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# TEST-DOC: Check that assignment to event parameters isn't visible to other handlers.
#
# @TEST-EXEC: bro -b %INPUT >output
# @TEST-EXEC: btest-diff output

event f(a: int) &priority=5
{
a = 2;
print "f1", a;
}

event f(a: int) &priority=-5
{
print "f2", a;
}

event bro_init()
{
event f(1);
}

0 comments on commit 5b88936

Please sign in to comment.