diff --git a/NEWS b/NEWS index 6f5acde047..0104e6a89f 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,9 @@ Changed Functionality an appropriate callback function, log a warning and return a generic handle value based on the analyzer and connection information. +- The ``&on_change`` attribute of set and tables is propagated through ``copy()``. + + Zeek 5.2.0 ========== diff --git a/src/Val.cc b/src/Val.cc index 3890e63361..387376a3ee 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2649,6 +2649,9 @@ ValPtr TableVal::DoClone(CloneState* state) detail::timer_mgr->Add(tv->timer); } + if ( change_func ) + tv->change_func = change_func; + if ( expire_func ) tv->expire_func = expire_func; diff --git a/testing/btest/Baseline/language.on_change-copy/output b/testing/btest/Baseline/language.on_change-copy/output new file mode 100644 index 0000000000..ec1bc1a6f9 --- /dev/null +++ b/testing/btest/Baseline/language.on_change-copy/output @@ -0,0 +1,9 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +inserting +tbl_change, a, 1, 5, TABLE_ELEMENT_NEW +set_change, hi, TABLE_ELEMENT_NEW +changing +tbl_change, a, 1, 5, TABLE_ELEMENT_CHANGED +deleting +tbl_change, a, 1, 2, TABLE_ELEMENT_REMOVED +set_change, hi, TABLE_ELEMENT_REMOVED diff --git a/testing/btest/language/on_change-copy.test b/testing/btest/language/on_change-copy.test new file mode 100644 index 0000000000..5eecfd6c6a --- /dev/null +++ b/testing/btest/language/on_change-copy.test @@ -0,0 +1,31 @@ +# @TEST-EXEC: zeek -b %INPUT >output +# @TEST-EXEC: btest-diff output + +module TestModule; + +function tbl_change(t: table[string, int] of count, tpe: TableChange, idxa: string, idxb: int, val: count) + { + print "tbl_change", idxa, idxb, val, tpe; + } + +function set_change(t: set[string], tpe: TableChange, idx: string) + { + print "set_change", idx, tpe; + } + +global t: table[string, int] of count &on_change=tbl_change; +global s: set[string] &on_change=set_change; + +event zeek_init() + { + local tc = copy(t); + local sc = copy(s); + print "inserting"; + tc["a", 1] = 5; + add sc["hi"]; + print "changing"; + tc["a", 1] = 2; + print "deleting"; + delete tc["a", 1]; + delete sc["hi"]; + }