mirror of
https://github.com/zeek/zeek.git
synced 2025-10-07 17:18:20 +00:00
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:
parent
0fa9590902
commit
4f9cb6912a
5 changed files with 82 additions and 2 deletions
5
CHANGES
5
CHANGES
|
@ -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)
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
2.4-571
|
2.4-572
|
||||||
|
|
17
src/Val.cc
17
src/Val.cc
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
20
testing/btest/Baseline/language.expire-func-undef/output
Normal file
20
testing/btest/Baseline/language.expire-func-undef/output
Normal 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}
|
40
testing/btest/language/expire-func-undef.bro
Normal file
40
testing/btest/language/expire-func-undef.bro
Normal 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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue