option.bif: Short-circuit option changes when terminating

Due to the asynchronous behavior of the input framework and broker
communication, change handlers were previously called even after
zeek_done() event processing completed and also broker shutdown.

Accessing broker store handles within change handlers this late
triggered invalid Broker store handle messages:

    error in ././my_option_store.zeek, line 13: invalid Broker store handle (Broker::put(Test::store, to_any_coercemy_option, to_any_coerceTest::new_value, 0 secs) and broker::store::{})

Fixes #2010
This commit is contained in:
Arne Welzel 2022-07-25 17:41:12 +02:00
parent 28081d1efa
commit 11cde53373
4 changed files with 45 additions and 0 deletions

View file

@ -0,0 +1,7 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
Initial value, T
Value of testbool changed from T to F (zeek_is_terminating=F)
Next value, F
Next changed, T
Final value, F
Final changed, F

View file

@ -0,0 +1,29 @@
# @TEST-DOC: Ensure change handlers do not run when terminating by trying to change an option during zeek_done()
# @TEST-EXEC: zeek -b %INPUT
# @TEST-EXEC: btest-diff .stdout
export {
option testbool: bool = T;
}
function option_changed(ID: string, new_value: bool): bool {
print fmt("Value of %s changed from %s to %s (zeek_is_terminating=%s)", ID, testbool, new_value, zeek_is_terminating());
return new_value;
}
event zeek_init()
{
print "Initial value", testbool;
Option::set_change_handler("testbool", option_changed);
local changed = Option::set("testbool", F);
print "Next value", testbool;
print "Next changed", changed;
}
event zeek_done()
{
local changed = Option::set("testbool", T);
print "Final value", testbool;
print "Final changed", changed;
}