diff --git a/CHANGES b/CHANGES index abbbcb6ff9..655a1419d3 100644 --- a/CHANGES +++ b/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 * Fixing a few Coverity warnings. (Robin Sommer) diff --git a/VERSION b/VERSION index b15074dfd9..bd4866e283 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4-571 +2.4-572 diff --git a/src/Val.cc b/src/Val.cc index f008c63787..6b63922575 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2285,8 +2285,23 @@ double TableVal::CallExpireFunc(Val* idx) 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(); + + Unref(vf); Unref(vs); delete vl; } diff --git a/testing/btest/Baseline/language.expire-func-undef/output b/testing/btest/Baseline/language.expire-func-undef/output new file mode 100644 index 0000000000..05b71a9908 --- /dev/null +++ b/testing/btest/Baseline/language.expire-func-undef/output @@ -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} diff --git a/testing/btest/language/expire-func-undef.bro b/testing/btest/language/expire-func-undef.bro new file mode 100644 index 0000000000..1184cd2bf2 --- /dev/null +++ b/testing/btest/language/expire-func-undef.bro @@ -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]); + } + +}