Fix for a table refering to a expire function that's not defined.

I was hoping to report this right at startup through a static check
but turns out we don't have the right machinery in place for that.
That would need to be done after the AST has been finalized, but our
AST traversal code can't iterate over types. So instead I've changed
this so that it's still being reported at runtime but at least
doesn't crash Bro anymore.

Closes BIT-1597.
This commit is contained in:
Robin Sommer 2016-05-23 12:45:23 -07:00
parent 0fa9590902
commit 4f9cb6912a
5 changed files with 82 additions and 2 deletions

View file

@ -1,4 +1,9 @@
2.4-572 | 2016-05-23 12:45:23 -0700
* Fix for a table refering to a expire function that's not defined.
Addresses BIT-1597. (Robin Sommer)
2.4-571 | 2016-05-23 08:26:43 -0700 2.4-571 | 2016-05-23 08:26:43 -0700
* Fixing a few Coverity warnings. (Robin Sommer) * Fixing a few Coverity warnings. (Robin Sommer)

View file

@ -1 +1 @@
2.4-571 2.4-572

View file

@ -2285,8 +2285,23 @@ double TableVal::CallExpireFunc(Val* idx)
try try
{ {
Val* vs = expire_expr->Eval(0)->AsFunc()->Call(vl); Val* vf = expire_expr->Eval(0);
if ( ! vf )
// Will have been reported already.
return 0;
if ( vf->Type()->Tag() != TYPE_FUNC )
{
Unref(vf);
vf->Error("not a function");
return 0;
}
Val* vs = vf->AsFunc()->Call(vl);
secs = vs->AsInterval(); secs = vs->AsInterval();
Unref(vf);
Unref(vs); Unref(vs);
delete vl; delete vl;
} }

View file

@ -0,0 +1,20 @@
1299470395.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299470405.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299473995.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299474005.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299477595.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299477605.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299481195.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299481205.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299484795.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299484805.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299488395.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299488405.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299491995.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299492005.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299495595.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299495605.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299499195.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299499205.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
1299502795.000000 error in /home/robin/bro/master/testing/btest/.tmp/language.expire-func-undef/expire-func-undef.bro, line 12: value used but not set (segfault::scan_summary)
orig: 10.0.0.2: peers: {\x0a\x0910.0.0.3\x0a}

View file

@ -0,0 +1,40 @@
# @TEST-EXEC: bro -r $TRACES/rotation.trace -b %INPUT >output 2>&1
# @TEST-EXEC: btest-diff output
module segfault;
export {
global scan_summary:
function(t: table[addr] of set[addr], orig: addr): interval;
global distinct_peers: table[addr] of set[addr]
&read_expire = 7 secs &expire_func=scan_summary &redef;
}
event new_connection(c: connection)
{
local orig = c$id$orig_h ;
local resp = c$id$resp_h ;
if (orig !in distinct_peers)
distinct_peers[orig]=set();
if (resp !in distinct_peers[orig])
add distinct_peers[orig][resp];
}
event bro_done()
{
for (o in distinct_peers)
{
print fmt("orig: %s: peers: %s", o, distinct_peers[o]);
}
}